Gientxk 2017-11-24 11:13 采纳率: 50%
浏览 4323
已采纳

多线程问题:使用两个线程交替打印A和B,使用最大打印次数控制,详见代码。

多线程问题:使用两个线程交替打印A和B,使用最大打印次数控制,详见代码。
出现的问题是:当运行线程B中的run()方法时,程序没有先while()判断,而是直接进入了while循环体。

 /**
 * 共享资源:打印机
 * @author Tangxkun
 *
 */
public class Printer {

    //最大打印次数
    private final int MAX_COUNT = 7;
    //false表示该打印机未打印A,true表示该打印机正在打印A
    private boolean printingA = false;
    private int count = 0;

    public synchronized void printA(){
        System.out.print(count++);
        printingA = true;
        System.out.print("A-");
        notifyAll();
    }
    public synchronized void printB(){
        System.out.print(count++);
        printingA = false;
        System.out.print("B-");
        notifyAll();
    }
    public synchronized void aWaiting() throws InterruptedException{
        while(printingA == true){
            wait();
        }
    }
    public synchronized void bWaiting() throws InterruptedException{
        while(printingA == false){
            wait();
        }
    }

    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public int getMAX_COUNT() {
        return MAX_COUNT;
    }
}
 /**
 * 打印A的线程
 * @author Tangxkun
 *
 */
public class PrintA implements Runnable{

    private Printer printer;

    public PrintA(Printer printer) {
        super();
        this.printer = printer;
    }

    @Override
    public void run() {
        while(printer.getCount() < printer.getMAX_COUNT()){

            printer.printA();

            try {
                printer.aWaiting();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

}
 /**
 * 打印B的线程
 * @author Tangxkun
 *
 */
public class PrintB implements Runnable{

    private Printer printer;

    public PrintB(Printer printer) {
        super();
        this.printer = printer;
    }

    @Override
    public void run() {
        while(printer.getCount() < printer.getMAX_COUNT()){

            try {
                printer.bWaiting();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            printer.printB();

        }
    }

}
 /**
 * 测试代码
 * @author Tangxkun
 *
 */
public class Test {

    public static void main(String[] args) {

        Printer printer = new Printer();
        PrintA printA = new PrintA(printer);
        PrintB printB = new PrintB(printer);

        Thread threadA = new Thread(printA,"A");
        Thread threadB = new Thread(printB, "B");

        threadA.start();
        threadB.start();

    }
}

当设置MAX_COUNT=5时,输出结果为:图片说明

当设置MAX_COUNT=6时,输出结果为:图片说明

当设置MAX_COUNT=7时,输出结果为:图片说明

烧脑了半天还是没有找出端倪,所以来请教一下各位大神!

  • 写回答

3条回答

  • Gientxk 2017-11-25 04:00
    关注

    原因终于找到了,是自己没有理解清楚线程挂起的概念。第一次执行线程B的时候,会while条件判断进入,然后挂起,并没有执行printer.printB(),当线程A唤醒线程B时,线程B从挂起时刻的代码处继续往后执行(执行printer.printB(),完成之前被挂起的任务),而不是重新开始执行run(),也就是说,不会再进行while条件判断,最后再次进入while循环。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已采纳回答 2月8日

悬赏问题

  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出