摘要: importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;/**本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西
阅读全文
posted @ 2011-12-17 23:38 李锡远-Taven 阅读(26) 评论(0)
编辑
摘要: /***Exchanger让两个线程互换信息*实例模拟服务生和顾客,服务生往空杯子中倒水,顾客从装满水的杯子中喝水,然后互换杯子,服务生接着倒水,顾客接着喝水.*//***使用Exchanger的关键技术点如下:*1.初始化Exchanger对象时,可以通过泛型指定杯子能交换的信息类型.如"newExchanger<String>;"表示只能交换String类型的信息*2.Exchanger的exchange方法表示当前线程准备交换信息,等待其他线程与它交换信息.当有其他线程调用该Exchanger对象的exchange方法时,立即交换信息*/publiccla
阅读全文
posted @ 2011-12-17 23:37 李锡远-Taven 阅读(16) 评论(0)
编辑
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
/**
* CyclicBarrier维持一个计数器,与CountDownLatch不同的是,等待这个CyclicBarrier的线程必须等到计数器的某个值时,才可以继续.
* CyclicBarrier就像它名字的意思一样,可看成是个障碍,所有的线程必须到齐后才能一起通过这个障碍.
*/
/**
* 本实例实现一个数组相邻元素的加法,一个线程给数组的第一个元素赋值,然后等待其它线程给数组第二个元素赋值,然后将第一个元素和第二个元素相加.
*/
/**
* CyclicBarrier的关键技术点如下:
* 1.构造CyclicBarrier对象时,需要指定计数器的目标值,计数器的初始值为0.
* 还可以在构造方法中带一个 Runnable参数,表示当计数器到达目标值是,在等待CyclicBarrier的线程被唤醒之前,指定该Runnable任务.
* 2.CyclicBarrier的await方法使当前线程进入等待状态,同时将计数器值加1,当计数器到达目标值时,当前线程被唤醒.
*/
public class CyclicBarrierTest {
public static class ComponentThread implements Runnable{
CyclicBarrier barrier;//计数器
int ID;//组件
int[] array; //数据数组
public ComponentThread(CyclicBarrier barrier,int[] array,int ID){
this.barrier = barrier;
this.ID = ID;
this.array = array;
}
public void run(){
try{
//Random的nextInt(int n)方法返回一个[0,n)范围内的随机数
array[ID] = new Random().nextInt(100);
System.out.println("Componet " + ID + " sleep...");
barrier.await();
System.out.println("Componet " + ID + " awaked...");
//计算数据数组中的当前值和后续值
int result = array[ID] + array[ID + 1];
System.out.println("Component " + ID + " result: " + result);
}catch(Exception ex){
}
}
}
/**测试CyclicBarrier的用法*/
public static void testCyclicBarrier(){
final int[] array = new int[3];
CyclicBarrier barrier = new CyclicBarrier(2,new Runnable(){
public void run(){
System.out.println("testCyclicBarrier run...");
array[2] = array[0] + array[1];
}
});
//启动线程
new Thread(new ComponentThread(barrier,array,0)).start();
new Thread(new ComponentThread(barrier,array,1)).start();
}
public static void main(String... args){
CyclicBarrierTest.testCyclicBarrier();
}
}
posted @ 2011-12-17 23:36 李锡远-Taven 阅读(24) 评论(0)
编辑
posted @ 2011-12-17 23:35 李锡远-Taven 阅读(30) 评论(0)
编辑
摘要: importjava.util.ArrayList;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Semaphore;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;/***Java5.0里新增加了4个协调线程间进程的同步装置,它们分别是:Semaphore,CountDownLatch,CyclicBarr
阅读全文
posted @ 2011-12-17 23:34 李锡远-Taven 阅读(19) 评论(0)
编辑
摘要: importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;/***有时候线程取得lock后需要在一定条件下才能做某些工作,比如经典的Producer和Consumer问题*在Java5.0以前,这种功能是由Object类的wait(),not
阅读全文
posted @ 2011-12-17 23:33 李锡远-Taven 阅读(20) 评论(0)
编辑
摘要: importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReadWriteLock;importjava.util.concurrent.locks.ReentrantLock;importjava.util.concurrent.locks.ReentrantReadWriteLoc
阅读全文
posted @ 2011-12-17 23:32 李锡远-Taven 阅读(30) 评论(0)
编辑