7.3 多线程之间的通讯
7.3.1 生产者和消费者
多线程的一个重要特点是它们之间可以互相通讯。你可以设计线程使用公用对象,每个线程都可以独立操作公用对象。典型的线程间通讯建立在生产者和消费者模型上:一个线程产生输出;另一个线程使用输入。
buffer让我们创建一个简单的"Alphabet Soup"生产者和相应的消费者.
7.3.2 生 产 者
生产者将从thread类里派生:
class Producer extends Thread {
private Soup soup;
private String alphabet = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public Producer(Soup s) {
//Keep our own copy of the shared object
this.soup = s;
}
public void run() {
char c; //Throw 10 letters into the soup
for (int i=0;i<10;i++) {
c = alphabet.charAt((int)(Math.random() *26));
soup.add(c); //print a record of osr addition
System.out.println("Added"+c + "to the soup.");
//wait a bit before we add the next letter
try {
sleep((int)(Math.random() *1000));
}
catch (InterruptedException e) {
//
}
}
}
}
注意我们创建了Soup类的一个实例。生产者用soup.add()函数来建立字符池。
7.3.3 消费者
让我们看看消费者的程序:
public class Consumer extends Thread {
private Soup soup;
public Consumer (Soup s) {
//keep our own copy of the shared object
this.soup = s;
}
public void run() {
char c;
//Eat 10 letters from the alphabet soup
for (int I=0 ;i<10;i++) {
//grab one letter
this.c = soup.eat();
//Print out the letter that we retrieved
System.out.println("Ate a letter: " +c); //
try {
sleep((int)(Math.raddom()*2000));
}
catch (InterruptedException e) {
}
` }
}
}
同理,象生产者一样,我们用soup.eat()来处理信息。那么,Soup类到底干什么呢?
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。