首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

并发编程回溯:睡眠和中断[整理中.]

2013-06-26 
并发编程回顾:睡眠和中断[整理中..]TimeUnit.SECONDS.sleep(1)//1sTimeUnit.MINUTES.sleep(1)//1min...

并发编程回顾:睡眠和中断[整理中..]
TimeUnit.SECONDS.sleep(1);//1sTimeUnit.MINUTES.sleep(1);//1min...

这种方式不需要以毫秒作为时间单位,功能与sleep相同。

JDK文档:TimeUnit表示给定单元粒度的时间段,它提供在这些单元中进行跨单元转换和执行计时及延迟操作的实用工具方法。

二、线程中断

线程在sleep时,可以将其中断,但如果是因IO阻塞或synchronized同步导致的线程挂起,是不能被中断的。

1、sleep、io、synchronized中断

先定义3个任务:

sleep任务:睡眠5s

class SleepBlocked implements Runnable{public void run() {try {System.out.println("Sleep Block.");TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {System.out.println("Sleep Interrupted!");}System.out.println("Exiting Sleep run...");}}

IO阻塞任务:读数据

class IOBlocked implements Runnable{private InputStream in;public IOBlocked(InputStream is){this.in=is;}public void run() {try {System.out.println("I/O Blocked.");in.read();//读数据} catch (IOException e) {if(Thread.currentThread().interrupted()){System.out.println("Interrupted from I/O");}}System.out.println("Exiting IOBlocked run...");}}

synchronized阻塞任务:block方法定义为synchronized,且方法内部无限循环会一直持有锁。

class SynchronizedBlocked implements Runnable{public synchronized void block(){System.out.println("Synchronized Blocked.");while(true){Thread.yield();//让步给其它线程}}public void run() {block();System.out.println("Exit SynchronizedBlocked...");}}

测试时,先启动这3个任务,然后分别中断掉这三个任务。

ExecutorService exec=Executors.newCachedThreadPool();Future f=exec.submit(new SleepBlocked());Future f1=exec.submit(new IOBlocked(System.in));Future f2=exec.submit(new SynchronizedBlocked());Thread.yield();//让步一下f.cancel(true);//true - 中断,false - 允许任务执行完f1.cancel(true);f2.cancel(true);

注意,取消任务时cancel的参数代表是否采用中断的方式结束。这里采用中断的方式,看看输出:

Sleep Block.I/O Blocked.Synchronized Blocked.Sleep Interrupted!Exiting Sleep run...

由此可见,3个任务启动后,分别进入阻塞状态,但只有sleep的中断起了作用,IO和synchronized的任务都没有被中断,而是处于一直阻塞等待的状态。

2、ReentrantLock中断

与synchronized不同的是,javase5的ReentrantLock是可以被中断的。这也是除了trylock外ReentrantLock与synchronized另一个不同点。

上代码:

class ReentrantInterruptTask implements Runnable{private Lock lock=new ReentrantLock();public void block(){try {System.out.println("blocking...");TimeUnit.SECONDS.sleep(20);//持有锁20sSystem.out.println("after sleep...");} catch (InterruptedException e) {System.out.println("lock Interrupted!");}System.out.println("Exit block...");}public void run(){System.out.println("ReentrantLock Lock.");lock.lock();block();System.out.println("Exit ReentrantInterruptTask run...");}}

设计

?

?

?

?

?

?

热点排行