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