1仲闽、線程通信概念
線程是操作系統(tǒng)中獨立的個體怕吴,但這些個體如果不經(jīng)過特殊的處理就不能成為一個整體雀彼,線程間的通信就成為整體的必勝方式之一。當線程存在通信指揮瘸彤,系統(tǒng)間的交互性更強大修然,在提高CPU利用率的同時還會使開發(fā)人員對線程任務在處理的過程中進行有效把握與監(jiān)控。
使用wait/notify
方法實現(xiàn)線程間的通信。都是Object
類的方法
-
wait/notify
必須配合synchronized
關(guān)鍵字使用愕宋,wait
方法釋放鎖玻靡,notify
方法不釋放鎖,會導致不實時 - 采用
CountDownLatch
可以實現(xiàn)實時通知中贝。不需要加鎖囤捻,countDown
類似于notify
,await
類似于wait
邻寿,實現(xiàn)兩個線程一個等待最蕾,一個喚醒。
package demo1;
import java.util.ArrayList;
import java.util.List;
import javax.management.RuntimeErrorException;
public class ListAdd2 {
private volatile static List list = new ArrayList();
public void add() {
list.add("bjsxt");
}
public int size() {
return list.size();
}
public static void main(String[] args) {
final ListAdd2 list2 = new ListAdd2();
final Object lock = new Object();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
list2.add();
System.out.println("當前線程:" + Thread.currentThread().getName() + "添加了一個元素..");
Thread.sleep(500);
if (list2.size() == 5) {
System.out.println("已經(jīng)發(fā)出通知..");
lock.notify();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
if (list2.size() != 5) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("當前線程:" + Thread.currentThread().getName() + "收到通知老厌,線程停止..");
throw new RuntimeException();
}
}
}, "t2");
t2.start();
t1.start();
}
}
package demo1;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class ListAdd3 {
private volatile static List list = new ArrayList();
public void add() {
list.add("bjsxt");
}
public int size() {
return list.size();
}
public static void main(String[] args) {
final ListAdd3 list2 = new ListAdd3();
final CountDownLatch countDownLatch = new CountDownLatch(1);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
for (int i = 0; i < 10; i++) {
list2.add();
System.out.println("當前線程:" + Thread.currentThread().getName() + "添加了一個元素..");
Thread.sleep(500);
if (list2.size() == 5) {
System.out.println("已經(jīng)發(fā)出通知..");
countDownLatch.countDown();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
if (list2.size() != 5) {
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("當前線程:" + Thread.currentThread().getName() + "收到通知瘟则,線程停止..");
throw new RuntimeException();
}
}, "t2");
t2.start();
t1.start();
}
}