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()方法逻辑即可。