一个简单的案例完成wait notify的线程间通信
两个List集合分别放着连续递增的数字,一个放着连续的大写字母,然后启动两个线程,分别打印各自集合的值,要求格式是12A34B56C。。。
代码部分:
public class ThreadMain {
public static void main(String[] args) {
//wait ---notify
AtomicInteger ai = new AtomicInteger(1);
ExecutorService threadPool = Executors.newFixedThreadPool(2);
Object object = new Object();
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
list1.add(5);
list1.add(6);
threadPool.execute(new NumberRunnable(list1, object,ai));
ArrayList<String> list2 = new ArrayList<String>();
list2.add("A");
list2.add("B");
list2.add("C");
threadPool.execute(new CharacterRunnable(list2, object,ai));
threadPool.shutdown();
}
}
打印数字的线程
public class NumberRunnable implements Runnable {
private List<Integer> list;
private Object lock;
private AtomicInteger ai;
public NumberRunnable(List<Integer> list, Object objLock, AtomicInteger ai) {
this.list = list;
this.lock = objLock;
this.ai = ai;
}
@Override
public void run() {
synchronized (lock) {
for (int i = 0; i < list.size(); i+=2) {
try {
if (ai.get() == 2) {
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(list.get(i));
System.out.println(list.get(i+1));
ai.set(2);
lock.notify();
}
}
}
}
打印字母的线程
public class CharacterRunnable implements Runnable {
private List<String> list;
private Object lock;
private AtomicInteger ai;
public CharacterRunnable(List<String> list, Object lock, AtomicInteger ai) {
this.list = list;
this.lock = lock;
this.ai = ai;
}
@Override
public void run() {
synchronized (lock) {
for (int i = 0; i < list.size(); i++) {
if (ai.get() == 1) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(list.get(i));
ai.set(1);
lock.notify();
}
}
}
}
运行结果:1 2 A 3 4 B 5 6 C