本文共 2905 字,大约阅读时间需要 9 分钟。
编写一个程序,开启3个线程,这三个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印20遍,要求输出的结果必须按顺序显示。如:ABCABCABC….依次递归
package thread.thread;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class AlterThread { public static void main(String[] args) { alterABC alter=new alterABC(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 20; i++) { alter.getA(i); } } },"A").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 20; i++) { alter.getB(i); } } },"B").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 20; i++) { alter.getC(i); } } },"C").start(); }}class alterABC{ int num=1; //显示锁 Lock lock=new ReentrantLock(); //线程通信 Condition condition1=lock.newCondition(); Condition condition2=lock.newCondition(); Condition condition3=lock.newCondition(); /** * 线程A打印 * @param totalnum */ public void getA(int totalnum) { lock.lock(); try { //1.判断,如果不是1,就等待 if(num!=1){ condition1.await(); } //2.打印 for (int i = 0; i <= 5; i++) { System.out.println(Thread.currentThread().getName()+"\t"+i+ "\t"+totalnum); } //3.通知对应线程 num=2; condition2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void getB(int totalnum) { lock.lock(); try { //1.判断,如果不是1,就等待 if(num!=2){ condition2.await(); } //2.打印 for (int i = 0; i <= 5; i++) { System.out.println(Thread.currentThread().getName()+"\t"+i+ "\t"+totalnum); } //3.通知对应线程 num=3; condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void getC(int totalnum) { lock.lock(); try { //1.判断,如果不是1,就等待 if(num!=3){ condition3.await(); } //2.打印 for (int i = 0; i <= 5; i++) { System.out.println(Thread.currentThread().getName()+"\t"+i+ "\t"+totalnum); } //3.通知对应线程 num=1; condition1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }}
转载地址:http://hjygi.baihongyu.com/