1. Exchanger
Exchanger提供了 一個同步點 , 在這個同步點,兩個線程可以交換數據,每個線程通過exchange()方法的入口提供數據給另外的線程,並接收其它線程提供的數據,並返回。
看個簡單的例子:
public static void main(String[] args){
final Exchanger exchanger = new Exchanger();
new Thread(new Runnable() {
@Override
public void run() {
System.err.println("我" + "我吧錢給你了");
try {
String result = (String) exchanger.exchange("50塊錢");
System.err.println("我收到-->"+result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.err.println("老闆"+"等錢到賬中");
String result = (String) exchanger.exchange("煙");
System.err.println("老闆收到-->"+result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
可以看到 Exchanger(交換器)的用法還是很簡單的。
2. Semaphore
計數信號量。通過acquire()和release()獲取和釋放訪問許可。
public static void main(String[] args){
final Semaphore semaphore = new Semaphore(2);
for (int i = 0; i < 10; i++) {
final int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
Thread.sleep(5000);
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
- 當我們不釋放的時候,無法獲取信號量的線程無法繼續執行
- 當信號量爲1的時候,可以實現線程同步。