H2O 와 자바 스 레 드 동기 화
3697 단어 자바 스 레 드
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();
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
H2O 와 자바 스 레 드 동기 화자바 5 이전 스 레 드 는 synchronized 와 wait, notify, notify All 을 동기 화 하여 거 칠 었 습 니 다.이후 로 크 와 컨 디 셔 닝 이 생 겼 다.ReentrantLock 의 간...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.