java线程协作范例

/**
 * 
 */
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


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。