H2O 와 자바 스 레 드 동기 화

3697 단어 자바 스 레 드
자바 5 이전 스 레 드 는 synchronized 와 wait, notify, notify All 을 동기 화 하여 거 칠 었 습 니 다.이후 로 크 와 컨 디 셔 닝 이 생 겼 다.ReentrantLock 의 간단 한 lock, unlock 은 syncronized 에 해당 합 니 다.condition 의 signal 과 await 를 통 해 더욱 세밀 한 통 제 를 실현 할 수 있 습 니 다.
http://www.cnblogs.com/yaowukonga/archive/2012/08/27/2658329.html    http://blog.csdn.net/vernonzheng/article/details/8288251   http://blog.csdn.net/fw0124/article/details/6672522
아래 의 이 예 는 본인 의 실현 이 니 지적 해 주시 기 바 랍 니 다.기본 적 인 뜻 은 H 함수 가 H 분 자 를 만 들 고 O 함수 가 O 분 자 를 만 들 며 각 스 레 드 에 하나의 분 자 를 만 들 고 H 가 두 개 있 고 O 가 있 을 때 이 세 스 레 드 는 탈퇴 한 다 는 것 이다.
사 고 를 실현 하 는 것 은 Condition 의 Queue 로 순 서 를 저장 하 는 것 입 니 다. 이렇게 하면 스 레 드 종료 순 서 를 제어 할 수 있 고 (수요 에 따라 서로 다른 순 서 를 실현 할 수 있 습 니 다) 놀 라 움 을 피 할 수 있 습 니 다.테스트 용례 는 H 와 O 가 부족 하고 초과 되 었 을 때의 상황 을 간단하게 테스트 했다.
import java.util.*;

import java.util.concurrent.locks.*;



class H2O implements Runnable

{

	static final Lock lock = new ReentrantLock();

	static LinkedList<Condition> hQueue = new LinkedList<Condition>();

	static LinkedList<Condition> oQueue = new LinkedList<Condition>();

	

	private String particle;

	private int id;

	

	public H2O(String particle, int id)

	{

		this.particle = particle;

		this.id = id;

	}



	public void run()

	{

		if (particle.equals("h"))

		{

			H(id);

		}

		else if (particle.equals("o"))

		{

			O(id);

		}

	}

	

	public static void H(int hid)

	{

		lock.lock();

		try {

			if (hQueue.size() >= 1 && oQueue.size() >= 1)

			{

				// generate water

				Condition hc = hQueue.poll();

				Condition oc = oQueue.poll();

				hc.signal();

				oc.signal();

				System.out.println("H:" + hid);

			}

			else

			{

				// wait

				Condition c = lock.newCondition();

				hQueue.add(c);

				c.await();

				System.out.println("H:" + hid);

			}

		} catch (InterruptedException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		} finally {

			lock.unlock();

		}

	}

	

	public static void O(int oid)

	{

		lock.lock();

		try {

			if (hQueue.size() >= 2)

			{

				// generate water

				Condition hc1 = hQueue.poll();

				Condition hc2 = hQueue.poll();

				hc1.signal();

				hc2.signal();

				System.out.println("O:" + oid);

			}

			else

			{

				// wait

				Condition c = lock.newCondition();

				oQueue.add(c);

				c.await();

				System.out.println("O:" + oid);

			}

		} catch (InterruptedException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		} finally {

			lock.unlock();

		}

	}

	

}



public class Solution {

    public static void main(String args[]) throws InterruptedException {

    	for (int i = 1; i <= 6; i++)

    	{

    		new Thread(new H2O("h", i)).start();

    	}

    	Thread.sleep(1000);

    	for (int i = 1; i <= 6; i++)

    	{

    		new Thread(new H2O("o", i)).start();

    	}

    	Thread.sleep(1000);

    	for (int i = 7; i <= 36; i++)

    	{

    		new Thread(new H2O("h", i)).start();

    	}

    	Thread.sleep(1000);

    	for (int i = 7; i <= 12; i++)

    	{

    		new Thread(new H2O("o", i)).start();

    	}

    	Thread.sleep(1000);

    	for (int i = 13; i <= 18; i++)

    	{

    		new Thread(new H2O("o", i)).start();

    	}

    }

}


좋은 웹페이지 즐겨찾기