标签:11 Producer 29 try flag 线程 2021 msg true
Object类的方法:等待wait() , 唤醒队首线程notify() , 唤醒全部等待线程notifyAll()。利用等待和唤醒实现Producer线程、Consumer线程的互斥访问Message对象。
代码如下:
package ThreadDemo;
class Message {
private String msg = "";
private boolean flag = true; //记录型信号量,规定true表示没有消息(允许生产、不许消费),false表示已有消息(不许生产、允许消费)
public synchronized void setMessage(String msg) {
if(flag==false) {
try {
super.wait(); //不许生产、让Producer线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.msg=msg;
flag = false; //生产完成,改变信号量、唤醒Consumer
super.notify();
}
public synchronized String getMessage() {
if(flag==true) {
try {
super.wait(); //不许消费、让Consumer线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
return "msg = "+this.msg;
}
finally { //return后用finally确保指令执行
flag = true; //消费完成,改变信号量、唤醒Producer
super.notify();
}
}
}
class Producer implements Runnable{
private Message msg;
public Producer(Message msg) {
this.msg = msg;
}
@Override
public void run() {
for(int x=0;x<30;x++) {
if(x%2==0) {
msg.setMessage("夏天,穿短袖短裤");
}
else {
msg.setMessage("冬天,换秋衣秋裤");
}
}
}
}
class Consumer implements Runnable{
private Message msg;
public Consumer(Message msg) {
this.msg = msg;
}
@Override
public void run() {
for(int x=0;x<30;x++) {
System.out.println(msg.getMessage());
}
}
}
public class Main {
public static void main(String[] args){
Message msg = new Message();
new Thread(new Producer(msg)).start(); //启动生产者线程
new Thread(new Consumer(msg)).start(); //启动消费者线程
}
}
标签:11,Producer,29,try,flag,线程,2021,msg,true 来源: https://www.cnblogs.com/fighterk/p/16214132.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。