Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用中断方法打印奇偶数时发生了什么?_Java_Multithreading - Fatal编程技术网

Java 使用中断方法打印奇偶数时发生了什么?

Java 使用中断方法打印奇偶数时发生了什么?,java,multithreading,Java,Multithreading,我正在尝试使用中断方法使用两个线程打印奇偶数。 我参考了来自互联网的代码,并编写了如下代码。它打印正确,但打印20后,程序继续执行 我必须在代码中做什么更改才能停止程序的执行 没有oldNum检查代码是否正常工作。是否有任何逻辑来提供oldNum检查 如果我从a行中删除Thread.sleep(1000L),那么它只打印“偶数线程打印20”并继续执行。这里发生了什么 在run()方法和主方法的for循环内部提供了断点,run()方法断点未命中。为什么会发生这种情况 简而言之,我想知道这里的代码流

我正在尝试使用中断方法使用两个线程打印奇偶数。 我参考了来自互联网的代码,并编写了如下代码。它打印正确,但打印20后,程序继续执行

  • 我必须在代码中做什么更改才能停止程序的执行

  • 没有
    oldNum
    检查代码是否正常工作。是否有任何逻辑来提供
    oldNum
    检查

  • 如果我从a行中删除
    Thread.sleep(1000L)
    ,那么它只打印“偶数线程打印20”并继续执行。这里发生了什么

  • run()
    方法和主方法的for循环内部提供了断点,
    run()
    方法断点未命中。为什么会发生这种情况

  • 简而言之,我想知道这里的代码流是什么。
    谢谢
    维卡什

    公共类PrintOddEvenUsingInterrupt{
    公共静态可变整数计数;
    公共静态void main(字符串[]args)引发InterruptedException{
    线程oddThread=新线程(新odddinterruptthread(),“奇数线程”);
    线程evenThread=新线程(新的EvenInterruptThread(),“偶数线程”);
    oddThread.start();
    evenThread.start();
    对于(int i=0;i<20;i++){
    计数++;
    oddThread.interrupt();//断点在这里起作用
    evenThread.interrupt();
    Thread.sleep(1000L);//Line-a
    }
    }
    静态类OddInterruptThread实现可运行{
    公开募捐{
    int oldNum=0;//断点在这里不起作用
    while(true){
    试一试{
    Thread.sleep(整数.MAX_值);
    }捕捉(中断异常e){
    }
    如果(oldNum!=计数和计数%2==1){
    System.out.println(Thread.currentThread().getName())
    +“打印”+计数);
    oldNum=计数;
    }
    }
    }
    }
    静态类EvenInterruptThread实现可运行{
    公开募捐{
    int oldNum=0;//断点在这里不起作用
    while(true){
    试一试{
    Thread.sleep(整数.MAX_值);
    }捕捉(中断异常e){
    }
    如果(oldNum!=计数和计数%2==0){
    System.out.println(Thread.currentThread().getName())
    +“打印”+计数);
    oldNum=计数;
    }
    }
    }
    }
    }    
    
    程序没有停止的原因是:当主线程退出时,奇偶线程在无限循环中休眠

    您需要定义一个停止条件,线程才能出来

    实现这一点的一种方法是使用条件。 例如:

    然后在线程中,不要无限循环,而是根据条件循环 而(!完成){ //还可以将线程睡眠更改为睡眠时间间隔更短(比如1000L或任何程序想要等待的时间) }

    对偶数线程执行相同的操作

    while (! evenFinished){
        // also change your thread sleep to sleep for fewer time interval (say 1000L or whatever your program wants to wait for)
    }
    
    在主线程中,您可以在for循环结束后添加以下代码

    oddFinished = true;
    evenFinished = true;
    
    oddThread.join();
    evenThread.join();
    

    这将允许您的代码正常停止。

    我认为最简单的解决方案是让您的线程成为恶魔。 在开始测试之前,只需添加以下行

    oddThread.setDaemon(true);
    evenThread.setDaemon(true);
    
    您的程序将在退出main后立即退出

    oddFinished = true;
    evenFinished = true;
    
    oddThread.join();
    evenThread.join();
    
    oddThread.setDaemon(true);
    evenThread.setDaemon(true);