java多线程(1)_正确使用Condition实现等待通知
来源:互联网 发布:红酒网络推广方案 编辑:程序博客网 时间:2024/06/05 18:20
ReentrantLock的基础了解
package cn.limbo.thread.ReentrantLockTest;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * Created by lhh on 2017/12/15. */public class MyService { private Lock lock = new ReentrantLock(); public void testMethod() { lock.lock(); for (int i = 0; i < 5; i++) { System.out.println("ThreadName= " + Thread.currentThread().getName() + (" " + (i + 1))); } lock.unlock(); }}class MyThread extends Thread { private MyService myService; public MyThread(MyService myService) { super(); this.myService = myService; } @Override public void run() { myService.testMethod(); }}class Run { public static void main(String[] args) { MyService myService = new MyService(); MyThread a1 = new MyThread(myService); MyThread a2 = new MyThread(myService); MyThread a3 = new MyThread(myService); MyThread a4 = new MyThread(myService); MyThread a5 = new MyThread(myService); a1.start(); a2.start(); a3.start(); a5.start(); a4.start(); }}
实现正确使用Condition实现等待通知
package cn.limbo.thread.MustUseMoreCondition_OK;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * <B>功能简述</B><br> * 使用多个Condition实现通知部分线程 * * @author lhh * @date 2017/12/15 下午6:40 * */public class MyService { private Lock lock = new ReentrantLock(); private Condition conditionA = lock.newCondition(); private Condition conditionB = lock.newCondition(); public void awaitA(){ try { lock.lock(); System.out.println(" begin awaitA 时间为 "+System.currentTimeMillis() + " ThreadName="+Thread.currentThread().getName()); conditionA.await(); System.out.println(" end awaitA 时间为 "+System.currentTimeMillis() + " ThreadName="+Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void awaitB(){ try { lock.lock(); System.out.println(" begin awaitB 时间为 "+System.currentTimeMillis() + " ThreadName= "+Thread.currentThread().getName()); conditionB.await(); System.out.println(" end awaitB 时间为 "+System.currentTimeMillis() + " ThreadName= "+Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void signalAll_A(){ try { lock.lock(); System.out.println(" signalAll_A 的时间为"+System.currentTimeMillis()+" ThreadName= "+Thread.currentThread().getName()); conditionA.signalAll(); } finally { lock.unlock(); } } public void signalAll_B(){ try { lock.lock(); System.out.println(" signalAll_B 的时间为"+System.currentTimeMillis()+" ThreadName= "+Thread.currentThread().getName()); conditionB.signalAll(); } finally { lock.unlock(); } }}class ThreadA extends Thread{ private MyService service; public ThreadA(MyService service) { super(); this.service = service; } @Override public void run() { service.awaitA(); }}class ThreadB extends Thread{ private MyService service; public ThreadB(MyService service) { super(); this.service = service; } @Override public void run() { service.awaitB(); }}class Run{ public static void main(String[] args) throws InterruptedException { MyService myService = new MyService(); ThreadA threadA = new ThreadA(myService); threadA.setName("A"); threadA.start(); ThreadB threadB = new ThreadB(myService); threadB.setName("B"); threadB.start(); Thread.sleep(3000); System.out.println("*************"); myService.signalAll_A(); }}
打印输出
begin awaitA 时间为 1513336178272 ThreadName=A begin awaitB 时间为 1513336178274 ThreadName= B ************* signalAll_A 的时间为1513336181278 ThreadName= main end awaitA 时间为 1513336181279 ThreadName=A
说明
使用ReentrantLock对象可以唤醒制定种类的线程,这是控制部分线程的方便行为
阅读全文
0 0
- java多线程(1)_正确使用Condition实现等待通知
- ReentrantLock(二):正确使用Condition实现等待与通知
- 多线程中使用Condition实现等待/通知
- Java多线程Condition实现等待/通知
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
- Java多线程编程-(16)-等待/通知模式接口Condition接口深入分析
- Java多线程编程-(18)-等待/通知模式接口Condition接口深入分析
- java并发编程 之 Condition(等待和通知)
- Condition实现生产者消费者模式(等待/通知机制)
- 【Java多线程】-Condition使用(生产者-消费者)
- java多线程协作(使用Condition)
- 显式锁(四)--- Lock的等待/通知机制Condition
- ReentrantLock使用Condition实现通知部分线程
- ReentrantLock使用Condition实现通知部分线程
- java5条件阻塞Condition的应用-多路等待通知Lock-Condition使用-笔记整理10
- 多线程 等待/通知机制的实现
- java多线程的等待和通知机制
- java多线程系列(三)---等待通知机制
- 【笔记-C语言】 字符串
- pintos (5) --Advanced Scheduler
- Dataland CD Label Designer(光盘封面制作软件)官方注册版V7.1.754下载
- 1204: 鸡兔同笼
- ST表
- java多线程(1)_正确使用Condition实现等待通知
- Struts2常用标签
- 【机器学习】--神经网络(NN)
- 【恍然大悟】【痛彻心扉】的领悟
- bzoj1001狼抓兔子——网络流平面图问题
- 洛谷P2617 Dynamic Ranking 树状数组套主席树
- FreeBASIC学习笔记——4.2 循环语句
- day06_schema
- Redis实战总结(三)