/**
*
*/
package com.shenli.thread.cooperation;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author ShenLi
* 要求用两个现成交替的打印出字母A~Z
* 线程协作
*
* 实现:通过构造两个线程,互相持有对方的观察对象来完成协作:
* 线程A拿到线程B的关注对象,线程B拿到线程A的观察对象
* 在程序启动的时候,两个现成默认都等待对象释放
* 由主线程首先释放其中一个对象,之后
* 两个对象交替执行,并交替释放对方的关注对象,
* 直到工作完成。
*
*/
public class ThreadCooperation extends Thread{
/**
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
Object flag1 = new Object();
Object flag2 = new Object();
MyThread t1 = new MyThread(flag1,flag2);
t1.start();
MyThread t2 = new MyThread(flag2,flag1);
t2.start();
Thread.sleep(2000L);
//通知其中一个线程开始工作
synchronized (flag1) {
flag1.notify();
}
}
//定义字母的初始值
private static final AtomicInteger ai = new AtomicInteger((int)‘A‘);
//定义字母的结束值
private static final int END = (int)‘Z‘;
/**
* 使用自定义线程实现
* @author ShenLi
*
*/
static class MyThread extends Thread{
//定义自己的线程观察对象
private Object self = null;
//定义另一个线程的观察对象
private Object other = null;
//在构造函数里传入两个现成的观察对象
public MyThread(Object self, Object other){
this.self = self;
this.other = other;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " is running...");
//未打印完成前一直循环
while(ai.get() < END){
//同步自己的观察对象
synchronized(self){
try {
//等待释放自己的观察对象后,进行字母打印
self.wait();
System.out.println(Thread.currentThread().getName() +" "+ (char)ai.getAndIncrement());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (other) {
//自己打印完之后,通知另一个线程可以继续打印。
other.notify();
}
}
}
}
}程序执行后输出:
Thread-0 is running... Thread-1 is running... Thread-0 A Thread-1 B Thread-0 C Thread-1 D Thread-0 E Thread-1 F Thread-0 G Thread-1 H Thread-0 I Thread-1 J Thread-0 K Thread-1 L Thread-0 M Thread-1 N Thread-0 O Thread-1 P Thread-0 Q Thread-1 R Thread-0 S Thread-1 T Thread-0 U Thread-1 V Thread-0 W Thread-1 X Thread-0 Y Thread-1 Z
原文:http://power9li.blog.51cto.com/8267716/1623927