用 wait/notify模拟实现一个 BlockingQueue
public class MyQueue { //承装元素的集合 private final LinkedList<Object> list = new LinkedList<Object>(); //计算器 private AtomicInteger count = new AtomicInteger(0); private final int minSize = 0; private final int maxSize; public MyQueue(int size) { this.maxSize = size; } // 初始化一个锁对象 private final Object lock = new Object(); public void put(Object obj){ synchronized (lock) { while (count.get()==this.maxSize) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //1.加入元素 list.add(obj); //2.计数器累加 count.incrementAndGet(); //3.通知另外的线程 lock.notify(); System.out.println(" 新加入的元素:"+obj); } } public Object take(){ Object ret = null; synchronized (lock) { while (count.get()==this.minSize) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } ret = list.removeFirst(); count.decrementAndGet(); lock.notify(); } return ret; } public int getSize(){ return this.count.get(); } public static void main(String[] args) { final MyQueue queue = new MyQueue(5); queue.put("1"); queue.put("2"); queue.put("3"); queue.put("4"); queue.put("5"); System.out.println("当前 queue 长度:"+queue.getSize()); Thread t1 = new Thread(new Runnable() { @Override public void run() { queue.put("a"); queue.put("b"); } },"t1"); t1.start(); Thread t2 = new Thread(new Runnable() { @Override public void run() { System.out.println("t2 take:" +queue.take()); System.out.println("t2 take:" +queue.take()); } },"t2"); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } t2.start(); } }
相关推荐
利用一个小型游戏的服务器和客服端之间的信息通信来介绍多线程之间的信息通信,以及通信可能存在的危险。
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
Qt线程之间通信、线程和进程之间通信实例,简单易懂
MFC多线程之间的通信:本程序通过2个示例展示了通过自定义消息在多线程之间传递消息。
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
利用多线程实现C#中socket网络通信模块,具体最大承受多少个客户端还不是很清楚,但是20个绝对没问题
一个简单的通信demo 当时做测试用的。包括客户端和服务端。 在非主线程中使用tcp的通信,基于qt编写
Winform 的多线程udp通信
本例中简单运用了线程间通信原理,简单明了,适合初学线程通信
C++实现多线程通信
基于QT5实现的串口通信,及多线程间的通信,使用自定义信号实现。
模仿QQ的多线程通信实例,供参考。 模仿QQ的多线程通信实例,供参考。
采用的是C#的Winform开发,提供了两种线程交互的方式。 第一:在主线程中开启两个子线程,子线程用事件方式来进行通信。对于主线程的控件操作采用的是delegate委托的方式,避免主线程假死。 第二:采用的是...
多线程实现Socket通信 多线程实现Socket通信 多线程实现Socket通信
多线程线程间通信,可用于控制线程内部函数,做处理......................................................
演示了如何使用自定义消息进行线程间通信,如何在线程间传递消息,可运行,VC历程
socket多线程通信源码 socket多线程通信源码
实现了子线程与主线程之间的通信;主线程给自己发消息、主线程给子线程发消息、子线程给主线程发消息等。
Java 线程通信示例 源代码 多线程之间通信,值得收藏
包括TCP服务器客户端多线程通信程序(用select实现),基于Visual Studio2017实现,已编译测试过,用到的朋友记得关闭SDL检查