2个线程轮流打印问题

package com.hnist.lzn.Java8; public class Num {int i = 1; //生产者消费者,的标志 boolean flag = false; //线程交替执行的标志}package com.hnist.lzn.Java8; public class PrintQ implements Runnable {Num num; public PrintQ(Num n){ num = n; }@Override public void run() { synchronized(num){ while(num.i<=100){if(!num.flag){try{ num.wait(); } catch (InterruptedException e) { e.printStackTrace(); }}else{System.out.println("偶数----"+num.i); num.i++; num.flag = false; num.notify(); }} }} }package com.hnist.lzn.Java8; /* 两个线程,一个打印100内的奇数一个打印100内的偶数,交替执行 */ //思路:2线程,交替执行,控制用锁 // 必须一个打印奇数,一个打印偶数,主要在于控制2个线程执行顺序,还是那个wait,notifyAll // 再扩散即,2个线程自己做自己的事,但是必须交替执行 // 因此2个线程逻辑不同,封装在不同的Runnable中,但是中间可能有通信,于是需要一个标志//打印奇数 public class Print implements Runnable {Num num; public Print(Num n) { num = n; } @Override public void run() { synchronized(num){ while(num.i<=100){//synchronizedif(num.flag) { try { num.wait(); } catch (InterruptedException e) { e.printStackTrace(); }}else{System.out.println("奇数"+num.i); num.i++; num.flag = true; num.notify(); }}}}public static void main(String[] args) {Num num = new Num(); //声明一个资源Print p1 = new Print(num); PrintQ p2 = new PrintQ(num); Thread th1 = new Thread(p1); Thread th2 = new Thread(p2); th1.start(); th2.start(); }}

//结论:
// 控制多个线程操作,通过封装不同的Runnable,使线程做出不同的操作
// 通过锁 来控制竞争
// 最主要是共享资源的控制,即共享资源决定不同的操作,这里的Num 的i来进行输出,flag公共标志来做出反应,生产者消费者模型,都是根据flag相反来做出决定的
【2个线程轮流打印问题】//继续发散一下,任意2个线程轮流做某事也行,更改相应的run()方法逻辑即可。

    推荐阅读