线程通信生产者和消费者传统版(sync-wait-notityAll)(lock-await-signal)
2021/5/9 10:29:59
本文主要是介绍线程通信生产者和消费者传统版(sync-wait-notityAll)(lock-await-signal),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1 import java.util.concurrent.locks.Condition; 2 import java.util.concurrent.locks.Lock; 3 import java.util.concurrent.locks.ReentrantLock; 4 5 /** 6 * 模拟增1和减一交替操作, 7 * 8 * 1 线程 操作(方法) 资源类 9 * 2 判断 干活 通知 10 * 3 防止虚假唤醒机制 11 */ 12 class ShareData{ 13 private int number=0; 14 private Lock lock=new ReentrantLock(); 15 private Condition condition=lock.newCondition(); 16 public void increment() throws Exception{ 17 lock.lock(); 18 System.out.println("increment加锁"+lock); 19 try{ 20 while(number!=0){ 21 System.out.println("while_in循环"+lock); 22 condition.await(); 23 } 24 number=number+1; 25 System.out.println(Thread.currentThread().getName()+"\t "+number); 26 condition.signalAll(); 27 }catch (Exception e){ 28 29 }finally { 30 lock.unlock(); 31 System.out.println("increment解锁"+lock); 32 } 33 } 34 public void decrement() throws Exception{ 35 lock.lock(); 36 System.out.println("decrement加锁"+lock); 37 try{ 38 while(number!=1){ 39 System.out.println("while_de循环"+lock); 40 condition.await(); 41 } 42 number=number-1; 43 System.out.println(Thread.currentThread().getName()+"\t "+number); 44 condition.signalAll(); 45 }catch (Exception e){ 46 47 }finally { 48 lock.unlock(); 49 System.out.println("decrement解锁"+lock); 50 } 51 } 52 53 } 54 class ShareData_sync{ 55 private int number=1; 56 public synchronized void increment() throws Exception{ 57 try{ 58 while(number!=1){ 59 this.wait(); 60 } 61 number=number+1; 62 System.out.println(Thread.currentThread().getName()+"\t "+number); 63 this.notifyAll(); 64 }catch (Exception e){ 65 66 } 67 } 68 public synchronized void decrement() throws Exception{ 69 try{ 70 while(number!=2){ 71 this.wait(); 72 } 73 number=number-1; 74 System.out.println(Thread.currentThread().getName()+"\t "+number); 75 this.notifyAll(); 76 }catch (Exception e){ 77 78 } 79 } 80 81 } 82 83 public class ProdConsumer_TraditionDemo { 84 85 public static void main(String[] args) { 86 ShareData shareData=new ShareData(); 87 new Thread(()->{ 88 for (int i = 0; i <5 ; i++) { 89 try { 90 shareData.increment(); 91 } catch (Exception e) { 92 e.printStackTrace(); 93 } 94 } 95 },"AA").start(); 96 new Thread(()->{ 97 for (int i = 0; i <5 ; i++) { 98 try { 99 shareData.decrement(); 100 } catch (Exception e) { 101 e.printStackTrace(); 102 } 103 } 104 105 },"BB").start(); 106 } 107 }
这篇关于线程通信生产者和消费者传统版(sync-wait-notityAll)(lock-await-signal)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26MATLAB 中 A(7)=[];什么意思?-icode9专业技术文章分享
- 2024-11-26UniApp 中如何实现使用输入法时保持页面列表不动的效果?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中怎么实现输入法弹出时禁止页面向上滚动?-icode9专业技术文章分享
- 2024-11-26WebSocket是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-26页面有多个ref 要动态传入怎么实现?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中实现一个底部输入框的常见方法有哪些?-icode9专业技术文章分享
- 2024-11-26RocketMQ入门指南:搭建与使用全流程详解
- 2024-11-26RocketMQ入门教程:轻松搭建与使用指南
- 2024-11-26手写RocketMQ:从入门到实践的简单教程
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版