如何把在多线程中让cjf交替出现

如何在两个线程池中让陈俊某和某某飞交替出现提个问题真费劲,123456789


package test;

public class 线程同步 implements Runnable {

    public static void main(String[] args) {
        线程同步 data = new 线程同步();
        Thread th1 = new Thread(data, "陈俊某");
        Thread th2 = new Thread(data, "某某飞");
        th1.start();
        th2.start();
    }

    boolean bFlag = true;

    @Override
    public void run() {
        while (true) {
            if (Thread.currentThread().getName().equals("陈俊某") && bFlag) {
                System.out.println("陈俊某");
                bFlag = false;
            } else if (Thread.currentThread().getName().equals("某某飞") && !bFlag) {
                System.out.println("某某飞");
                bFlag = true;
            }
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

线程类

package com.thread;

public class WorkThread implements Runnable {
    
    //输出的名字
    private String name;
    //本线程工作标志
    private int myFlag;

    public WorkThread(String name, int myFlag){
        this.name = name;
        this.myFlag = myFlag;
    }
    @Override
    public void run() {
        while(true){
            int currFlag = ThreadController.getFlag();
            if(currFlag == myFlag){
                //当前标志和线程工作标志一致,输出名字
                System.out.println(Thread.currentThread().getName() + " - " + this.name);
                
                //改变标志,触发另一个线程输出其他名字
                ThreadController.chageFlag();
            }
            
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}


//标志管理类

package com.thread;

public class ThreadController {
    
    //两个值的标志量
    //volatile的作用 变量值改变让所有线程可见
    private volatile static int flag = 0;
    
    synchronized public static int getFlag(){
        //返回当前标志量
        return flag;
    }

    synchronized public static void chageFlag(){
        //改变当前标志量
         flag = (flag == 0? 1: 0);
    }
}

测试类


package com.thread;

public class Test {

    public static void main(String[] args) {
        //标志为0时,输出"陈俊某"
        Thread t1 = new Thread(new WorkThread("陈俊某", 0));
        t1.start();
        //标志为1时,输出"某某飞"
        Thread t2 = new Thread(new WorkThread("某某飞", 1));
        t2.start();
    }
}

结果:

img

那可以采用生产者消费者模式呀