Java多线程编程核心技术( 八 )


使用对象可以对线程执行的业务进行排序规划 。
package com.xkf.reentrantLock.demo.awaitUninterruptibly;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/*** 使用Condition对象对线程执行业务进行排序规划* @author katy.xie**/public class ConditionPerformOrder {volatile private static int nextPrintWho = 1;private static ReentrantLock lock = new ReentrantLock();final private static Condition conditionA = lock.newCondition();final private static Condition conditionB = lock.newCondition();final private static Condition conditionC = lock.newCondition();public static void main(String[] args) {Thread threadA = new Thread(){@Overridepublic void run() {try {lock.lock();while(nextPrintWho != 1){conditionA.await();}for (int i = 0; i < 3; i++) {System.out.println("ThreadA :" + (i + 1));}nextPrintWho = 2;conditionB.signalAll();} catch (Exception e) {e.printStackTrace();}finally{lock.unlock();}}};Thread threadB = new Thread(){@Overridepublic void run() {try {lock.lock();while(nextPrintWho != 2){conditionB.await();}for (int i = 0; i < 3; i++) {System.out.println("ThreadB :" + (i+ 1));}nextPrintWho = 3;conditionC.signalAll();} catch (Exception e) {e.printStackTrace();} finally{lock.unlock();}}};Thread threadC = new Thread(){@Overridepublic void run() {try {lock.lock();while(nextPrintWho != 3){conditionC.await();}for (int i = 0; i < 3; i++) {System.out.println("ThreadC :" + (i + 1));}nextPrintWho = 1;conditionA.signalAll();} catch (Exception e) {e.printStackTrace();} finally{lock.unlock();}}};Thread[] aThreadArray = new Thread[5];Thread[] bThreadArray = new Thread[5];Thread[] cThreadArray = new Thread[5];for (int i = 0; i < 5; i++) {aThreadArray[i] = new Thread(threadA);bThreadArray[i] = new Thread(threadB);cThreadArray[i] = new Thread(threadC);aThreadArray[i].start();bThreadArray[i].start();cThreadArray[i].start();}}}
42.ck
具有完全排斥其他的效果 , 即同一时间只有一个线程在执行.lock()后面的任务 。
这样做虽然保证了实例变量的线程安全性 , 但是效率却很低下 。
ck读写锁 , 在某些不需要操作实例变量的方法中 , 完全可以使用ck提升运行效率 。
ck包含读操作相关的锁 , 也称共享锁 , 写操作锁 , 也叫排他锁 。
多个读锁之间不排斥 , 读锁与写锁互斥 , 写锁与写锁互斥 。
在没有线程进行写入操作时 , 进行读取操作的多个都可以获取读锁 , 而进行写入操作的只有在获取写锁后才能进行写入操作 。
多个可以同时进行读取操作 , 但是同一时刻只允许一个进行写入操作 。
43.定时器Timer
Timer主要作用是设置计划任务 , 即在指定的时间开始执行某一个任务
封装任务的类是 , 执行计划任务的代码要放在里 ,  是一个抽象类 。
( task, Date time):在指定的日期执行一次某一任务 。
是以队列的方式一个个被顺序执行 , 所以执行时间有可能也与语气的时间不一致 , 因为前面的任务有可能消耗的时间较长 , 则后面的任务运行时间也会被延迟 。
( task, Date , long )
在指定的日期后 , 按照指定的间隔周期性的无限循环地执行某一任务 。
( task, long delay): 以当前时间为参考 , 在此基础上延迟指定的毫秒数后执行一次任务 。
( task, long delay, long ):以当前时间为参考 , 在此基础上延迟指定的毫秒数 , 再以某一间隔时间无限次数地执行某一任务 。
的 () 将自身从队列任务中清除 , 其他任务不受影响 。
Timer的() 将任务队列中的全部任务清除 , 有时并不一定停止执行计划任务 , 而是正常执行 。