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