多线程之间通信
如生产者与消费者的通信,操作同一个共享资源
关键:通过一个标记来控制资源的状态,使用wait与notify/notifyAll实现线程的切换
生产者负责生产,满则等待,空则生产;
消费者负责消费,空则等待,有则消费;
单一生产者与消费者的时候,可以使用if判断标记,使用notify唤醒对方线程
如果在多生产者多消费者的情况下,必须使用while判断标记,使用notifyAll唤醒对方线程
因为,只有使用while循环判断,才能避免多生产的问题(生产多个,只消费1个)
只有使用notifyAll才能保证对方线程被唤醒
因为notify有可能唤醒到的是本方线程,从而导致双方线程都等待,程序无法继续运行!
生产者与消费者
资源
package com.gc.thread.producer; public class Resource{ private String name;//资源 private int No;//资源编号 boolean flag = false;//仓库是否有资源 /** * 生产者 * @param name */ public synchronized void produce(String name) { //如果已经生产了,则等待消费者消费 while(flag) { try { this.wait();//每次被唤醒都重新判断标记 } catch (InterruptedException e) { e.printStackTrace(); } } //为商品编号 this.name = name + (++No); //生产1个商品 System.out.println(Thread.currentThread().getName()+"--->生产:" + this.name); //更新标记 this.flag = true; //唤醒消费者(如果使用notify唤醒1个线程,不能保证一定唤醒到的是对方线程,如果唤醒到了本方线程,则可能造成双方线程都处于冻结状态,程序将无法继续运行) this.notifyAll(); } /** * 消费者 */ public synchronized void consume() { //如果没有商品,则等待生产者生产 while(!flag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //消费1个商品 System.out.println(Thread.currentThread().getName()+"------>消费:" + this.name); //更新标记 this.flag = false; //唤醒生产者 this.notifyAll(); } }
生产者
package com.gc.thread.producer; public class Producer implements Runnable { private Resource r; public Producer(Resource r) { this.r = r; } @Override public void run() { while(true) r.produce("goods"); } }
消费者
package com.gc.thread.producer; public class Consumer implements Runnable { private Resource r; public Consumer(Resource r) { this.r = r; } @Override public void run() { while(true) r.consume(); } }
开启线程
package com.gc.thread.producer; public class Demo { public static void main(String[] args) { //资源 Resource r = new Resource(); //生产者 Producer producer1 = new Producer(r); Producer producer2 = new Producer(r); //消费者 Consumer consumer1 = new Consumer(r); Consumer consumer2 = new Consumer(r); new Thread(producer1).start(); new Thread(producer2).start(); new Thread(consumer1).start(); new Thread(consumer2).start(); } }
相关推荐
利用一个小型游戏的服务器和客服端之间的信息通信来介绍多线程之间的信息通信,以及通信可能存在的危险。
MFC多线程之间的通信:本程序通过2个示例展示了通过自定义消息在多线程之间传递消息。
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
多线程实现Socket通信 多线程实现Socket通信 多线程实现Socket通信
基于QT5实现的串口通信,及多线程间的通信,使用自定义信号实现。
利用多线程实现C#中socket网络通信模块,具体最大承受多少个客户端还不是很清楚,但是20个绝对没问题
演示了如何使用自定义消息进行线程间通信,如何在线程间传递消息,可运行,VC历程
Winform 的多线程udp通信
Socket通讯,多线程,有客户端服务器
C++实现多线程通信
一个简单的通信demo 当时做测试用的。包括客户端和服务端。 在非主线程中使用tcp的通信,基于qt编写
Delphi API 串口通信 多线程例子.rar
模仿QQ的多线程通信实例,供参考。 模仿QQ的多线程通信实例,供参考。
socket多线程通信源码 socket多线程通信源码
基于MFC开发的串口通信,技术用到API,和多线程开发串口通信
我用MFC VS2010编写的一个 TCP 一对多通信的程序,就是服务器端利用多线程技术(不使用Select等任何模型), 能同时接收多个客户端的消息, 其次, 服务器端还能将消息群发给所有已连接的客户端, 实现的基本思路 是...
多线程通信读写文件代码,根据其他的代码文档修改,用于学习多线程通信。
java tcp socket 多线程多句通信
包括TCP服务器客户端多线程通信程序(用select实现),基于Visual Studio2017实现,已编译测试过,用到的朋友记得关闭SDL检查