标签:运行 art number await port catch ack join nts
关于等待状态的线程调用interrupt方法报异常:InterruptedException
当线程被阻塞,比如wait,join,sleep等,在调用interrupt方法,没有占用cpu运行的线程是不可能给自己的中断状态置位的,这就产生了InterruptedException异常.
一.CountDownLatch(允许一个或多个线程等待其它线程完成操作)
代码实例:
package com.thread.ccse;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* Created by IntelliJ IDEA.
* User: 周强
* Description:
* Date: 2017/8/9
* Time: 21:04
*/
public class CountDownLatchTest {
public static CountDownLatch c = new CountDownLatch(4);
public static void main(String [] args) throws InterruptedException {
Thread t =new Thread(new Runnable() {
@Override
public void run() {
System.out.println(c.getCount()); //第1
c.countDown();
System.out.println(c.getCount());//第2
c.countDown();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(c.getCount());//第3
c.countDown();
System.out.println(c.getCount());//第4
}
});
t.start();
c.await(2, TimeUnit.SECONDS);
c.countDown();
System.out.println(c.getCount( ));//第5
}
}
输出结果如下:
Connected to the target VM, address: ‘127.0.0.1:55816‘, transport: ‘socket‘ 4 第1 3 第2 1 第5 Disconnected from the target VM, address: ‘127.0.0.1:55816‘, transport: ‘socket‘ 1 第3 0 第4 Process finished with exit code 0
由于线程t沉睡时间大于CountDownLatch c的等待时间,所以线程t在主线证执行完毕后才结束的.
二:CyclicBarrier(指定线程数,必须在该线程数内的线程全部到达同步点,才继续往下执行)
示例代码:
package com.thread.ccse;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* Created by IntelliJ IDEA.
* User: 周强
* Description:
* Date: 2017/8/9
* Time: 21:30
*/
public class CyclicBarrierTest {
static Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("3");
}
});
static Thread thread = null;
public static CyclicBarrier c = new CyclicBarrier(2,t);
static {
thread = new Thread(new Runnable() {
@Override
public void run() {
try {
c.await();
System.out.println("1");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
public static void main(String [] args){
thread.start();
try {
c.await();
System.out.println("2");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
执行结果:
Disconnected from the target VM, address: ‘127.0.0.1:56157‘, transport: ‘socket‘ 3 2 1//其中,3 肯定是最先输出的,1 和 2 的输出顺序是不一定的 Process finished with exit code 0
CountDownLatch和CyclicBarrier的区别:
CountDownLatch计数器只能使用一次,而CyclicBarrier的计数器可以使用多次,因为CyclicBarrier可以使用reset方法重置计数器;
CyclicBarrier还提供其它方法,如getNumberWating方法可以获得CyclicBarrier阻塞的线程数,isBroken方法可以用来了解阻塞的线程是否被中断。
三:
待续
ccse(CountDownLatch,CycliBarrier,Semaplore,Exchanger)
标签:运行 art number await port catch ack join nts
原文地址:http://www.cnblogs.com/zqsky/p/7328013.html