A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘天功 中级黑马   /  2012-11-23 11:42  /  1455 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



线程之间如何实现通信?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
生产者和消费者之间的消息传递过程
由两个线程分别控制的 你看看线程间通信的机制吧
class ShareData

{

private char c;

private boolean isProduced = false; // 信号量

public synchronized void putShareChar(char c) // 同步方法putShareChar()

{

if (isProduced) // 如果产品还未消费,则生产者等待

{

try

{

wait(); // 生产者等待

}catch(InterruptedException e){

e.printStackTrace();

}

}

this.c = c;

isProduced = true; // 标记已经生产

notify(); // 通知消费者已经生产,可以消费

}

public synchronized char getShareChar() // 同步方法getShareChar()

{

if (!isProduced) // 如果产品还未生产,则消费者等待

{

try

{

wait(); // 消费者等待

}catch(InterruptedException e){

e.printStackTrace();

}

}

isProduced = false; // 标记已经消费

notify(); // 通知需要生产

return this.c;

}

}

class Producer extends Thread // 生产者线程

{

private ShareData s;

Producer(ShareData s)

{

this.s = s;

}

public void run()

{

for (char ch = ''A''; ch <= ''D''; ch++)

{

try

{

Thread.sleep((int)(Math.random()*3000));

}catch(InterruptedException e){

e.printStackTrace();

}

s.putShareChar(ch); // 将产品放入仓库

System.out.println(ch + " is produced by Producer.");

}

}

}

class Consumer extends Thread // 消费者线程

{

private ShareData s;

Consumer(ShareData s)

{

this.s = s;

}

public void run()

{

char ch;

do{

try

{

Thread.sleep((int)(Math.random()*3000));

}catch(InterruptedException e){

e.printStackTrace();

}

ch = s.getShareChar(); // 从仓库中取出产品

System.out.println(ch + " is consumed by Consumer. ");

}while (ch != ''D'');

}

}

class CommunicationDemo

{

public static void main(String[] args)

{

ShareData s = new ShareData();

new Consumer(s).start();

new Producer(s).start();

}

}

评分

参与人数 2技术分 +1 黑马币 +6 收起 理由
崔政 + 1 赞一个!
潘天功 + 6

查看全部评分

回复 使用道具 举报
jerry2627 发表于 2012-11-23 13:40
生产者和消费者之间的消息传递过程
由两个线程分别控制的 你看看线程间通信的机制吧
class ShareData

谢谢、明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马