闭锁
CountDownLatch主要用来确保某些活动知道其他活动完成后才继续执行,主要用在下面三个方面。
1、当某几个线程等待某一个线程的执行结果,可以使用此方法(FutureTask同样可以实现,大家可以试一下)
2、当希望所有线程都准备好后,再进行执行
3、可以很好的实现对线程执行状态、执行时间的监控
主要使用方法
await:在值归0前,将一直阻塞
countDown:值递减1闭锁侧重点在线程执行的顺序的控制。
程序一:利用coundDownLatch实现对线程的控制
final CountDownLatch start = new CountDownLatch(1);
public static void main(String[] args) {
new MyCountDown().threadWait();
}
public void threadWait() {
new Thread(new Runnable() {
@Override
public void run() {
try {
for(int i=0;i<10;i++) {
Thread.sleep(1*1000);
System.out.println("指定一次操作");
}
start.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
start.await();
System.out.println(Thread.currentThread().getName()+"执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.setName("线程2");
t.start();
Thread t0 = new Thread(new Runnable() {
@Override
public void run() {
try {
start.await();
System.out.println(Thread.currentThread().getName()+"执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t0.setName("线程3");
t0.start();
}
当闭锁进入终止状态,不能重置。
信号量
Semaphore用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量,可以用来实现阻塞的集合。
主要使用的方法
acquire:获取一个许可,如果没有将阻塞
release:释放被占用的许可给信号量 信号量侧重点在资源的控制。被占用的许可被释放并返还给信号量。
程序二:利用semaphore实现对资源的控制
public final Set<String> set;
private Semaphore semaphore;
public MySemaphore(int a) {
set = Collections.synchronizedSet(new HashSet<String>());
semaphore = new Semaphore(10);
}
public void add(String str) throws InterruptedException {
semaphore.acquire(); // 获取一个许可,同时信号量减一,如果不能获取许可,将阻塞
/dosomething
}
public void remove(String str) {
/dosomething
semaphore.release(); // 释放许可返还给信号量
}
信号量侧重点在资源的控制。被占用的许可可以被释放并返还给信号量。