简单的通讯: 生产者、消费者问题public class CubbyHole {
private int contents;
private boolean available = false;
public synchronized int get() {
while (available == false) {
try {
// wait for Producer to put value
wait();
} catch (InterruptedException e) { }
}
available = false;
// notify Producer that value has been retrieved
notifyAll();
return contents;
}
public synchronized void put(int value) {
while (available == true) {
try {
// wait for Consumer to get value
wait();
} catch (InterruptedException e) { }
}
contents = value;
available = true;
// notify Consumer that value has been set
notifyAll();
} }
public class Producer extends Thread {
private CubbyHole cubbyhole;
private int number; public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
} public void run() {
for (int i = 0; i < 10; i++) {
cubbyhole.put(i);
System.out.println("Producer #" + this.number
+ " put: " + i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) { }
}
}
}
public class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number; public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
} public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get();
System.out.println("Consumer #" + this.number
+ " got: " + value);
}
}
}
public class ProducerConsumerTest {
public static void main(String[] args) {
CubbyHole c = new CubbyHole();
Producer p1 = new Producer(c, 1);
Consumer c1 = new Consumer(c, 1); p1.start();
c1.start();
}
}
怎么样?没有用管道,也照样可以把需要的信息从一个Thread传给另外一个
private int contents;
private boolean available = false;
public synchronized int get() {
while (available == false) {
try {
// wait for Producer to put value
wait();
} catch (InterruptedException e) { }
}
available = false;
// notify Producer that value has been retrieved
notifyAll();
return contents;
}
public synchronized void put(int value) {
while (available == true) {
try {
// wait for Consumer to get value
wait();
} catch (InterruptedException e) { }
}
contents = value;
available = true;
// notify Consumer that value has been set
notifyAll();
} }
public class Producer extends Thread {
private CubbyHole cubbyhole;
private int number; public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
} public void run() {
for (int i = 0; i < 10; i++) {
cubbyhole.put(i);
System.out.println("Producer #" + this.number
+ " put: " + i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) { }
}
}
}
public class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number; public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
} public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get();
System.out.println("Consumer #" + this.number
+ " got: " + value);
}
}
}
public class ProducerConsumerTest {
public static void main(String[] args) {
CubbyHole c = new CubbyHole();
Producer p1 = new Producer(c, 1);
Consumer c1 = new Consumer(c, 1); p1.start();
c1.start();
}
}
怎么样?没有用管道,也照样可以把需要的信息从一个Thread传给另外一个
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货