package multiThreads;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class H2O {
int Hcount;
int Ocount;
Lock lock = new ReentrantLock();
Condition cH = lock.newCondition();
Condition cO = lock.newCondition();
public void H() {
lock.lock();
Hcount++;
if (Hcount >= 2 && Ocount >= 1) {
Hcount -= 2;
Ocount -= 1;
cH.signal();
cO.signal();
System.out.println("H2O");
} else {
try {
cH.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.unlock();
}
public void O() {
lock.lock();
Ocount++;
if (Hcount >= 2 && Ocount >= 1) {
Hcount -= 2;
Ocount -= 1;
cH.signal();
cH.signal();
System.out.println("H2O");
} else {
try {
cO.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.unlock();
}
}
class Hclass implements Runnable {
private H2O obj;
public Hclass(H2O obj) {
this.obj = obj;
}
@Override
public void run() {
// TODO Auto-generated method stub
obj.H();
}
}
class Oclass implements Runnable {
private H2O obj;
public Oclass(H2O obj) {
this.obj = obj;
}
@Override
public void run() {
// TODO Auto-generated method stub
obj.O();
}
}
public class H2Oexample {
final private static H2O obj = new H2O();
public static void main(String[] args) {
for (int i = 0; i< 10; i++) {
new Thread(new Hclass(obj)).start();
}
for (int i = 0; i< 5; i++) {
new Thread(new Oclass(obj)).start();
}
}
}
Tuesday, July 29, 2014
Java多线程入门(三) H2O
题目: 实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个 call O的线程返回(产生一个水分子),其他的都block。
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment