博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jdk1.5多线程Lock接口及Condition接口
阅读量:4514 次
发布时间:2019-06-08

本文共 3169 字,大约阅读时间需要 10 分钟。

jdk1.5多线程的实现的方式:

jdk1.5之前对锁的操作是隐式
synchronized(对象) //获取锁
{

} //释放锁

jdk1.5锁的操作是显示的:在包java.util.concurrent.locks中含有多线程实现方式相关的接口和类。
有一个描述锁的Lock接口,也就是把锁面向对象了
使用Lock接口的子类ReentrantLock创建一把锁
Lock lock = new ReentrantLock();
使用Lock替代同步代码块的方式:
1:创建一把锁
2:把之前写在同步代码块中的代码写在lock()和unlock()之间

用lock替代同步代码块之后出现了IllegalMonitorStateException(无效的监视器状态异常)

因为wait(),notifyAll()必须用在同步中,而同步被Lock替代了,所以出现异常
jdk1.5对唤醒等待方法也进行了单独的描述,描述的接口是Condition。
唤醒等待方法必须结合锁来使用,所以使用LocknewCondition()方法来获取和锁绑定的Condition对象。

下面使用jdk1.5多线程的实现方式,解决一次唤醒所有线程性能低的问题。

1 import java.util.concurrent.locks.*;  2 class Product  3 {  4     private String name;  5     private int count;  6     private boolean flag;  7   8     //创建一把锁  9     private Lock lock = new ReentrantLock(); 10  11     //得到和锁绑定的Condition对象,控制生产线程的唤醒和等待 12     private Condition pro = lock.newCondition(); 13     //得到和锁绑定的Condition对象,控制消费线程的唤醒和等待 14     private Condition con = lock.newCondition(); 15      16     //生产产品的功能 17     public void produce(String name) 18     { 19         lock.lock(); //获取锁 20         try 21         { 22             while (flag)  23             { 24                 try{pro.await();}catch (InterruptedException e){e.printStackTrace();} 25             } 26             this.name = name+"..."+count; 27             System.out.println(Thread.currentThread().getName()+"***生产了***"+this.name); 28             count++; 29             flag = true; 30             con.signal(); 31         } 32         finally   //为了保证锁必须被释放掉,使用try{...}finally{...} 33         { 34             lock.unlock(); //释放锁 35         } 36     } 37  38     //消费产品的功能 39     public void consume() 40     { 41         lock.lock(); 42         try 43         { 44             while (!flag) 45             { 46                 try{con.await();}catch (InterruptedException e){e.printStackTrace();} 47             } 48             System.out.println(Thread.currentThread().getName()+"---消费了---"+this.name); 49             flag = false; 50             pro.signal(); 51         } 52         finally 53         { 54             lock.unlock(); 55         } 56     } 57 } 58  59 //生产任务 60 class Producer implements Runnable 61 { 62     private Product pro; 63     public Producer(Product pro) 64     { 65         this.pro = pro; 66     } 67     public void run() 68     { 69         while(true) 70         { 71             pro.produce("笔记本电脑"); 72         } 73     } 74 } 75  76 //消费任务 77 class Consumer implements Runnable 78 { 79     private Product pro; 80     public Consumer(Product pro) 81     { 82         this.pro = pro; 83     } 84     public void run() 85     { 86         while(true) 87         { 88             pro.consume(); 89         } 90     } 91 } 92  93 class Demo 94 { 95     public static void main(String[] args)  96     { 97         Product pro = new Product(); 98          99         Producer producer = new Producer(pro);100         Consumer consumer = new Consumer(pro);101 102         new Thread(producer,"生产线01").start();103         new Thread(consumer,"消费者01").start();104         new Thread(producer,"生产线02").start();105         new Thread(consumer,"消费者02").start();106     }107 }

 

转载于:https://www.cnblogs.com/tzc1024/p/6138192.html

你可能感兴趣的文章
Kinect for windows
查看>>
Java EE Map
查看>>
Hadoop源代码点滴-文件系统HDFS
查看>>
单个页面Request编码方式的改变,无需改动Web.config~
查看>>
SQL Server中的窗口函数
查看>>
【Alpha】Daily Scrum Meeting第十次
查看>>
戴尔Inspiron N4120 笔记本电脑安装XP、win7双系统过程
查看>>
Android 适配知识点
查看>>
Android中常用的几种加密
查看>>
50.Android编码规范
查看>>
linux下source命令的基本功能
查看>>
linux-IO重定向-文本流重定向
查看>>
MSSQLSERVER服务无法启动的解决方案
查看>>
MySQL数据库管理
查看>>
ASP.NET中进度条的简单应用
查看>>
Java Activiti6.0 spring5 SSM 工作流引擎 审批流程 java项目框架
查看>>
md5
查看>>
Linux下的crontab定时执行任务命令详解
查看>>
C#高级编程(第7版) Professional C# 4 and .NET 4 - 读书笔记
查看>>
ipad4自动下载了ios8的安装包,好几个G啊,不想更新,怎么删了呢?
查看>>