我正在尝试使用带有中断方法的两个线程来打印偶数。 我从互联网上查阅了代码,并编写了如下所示的代码。它可以正常打印,但在打印20后程序正在继续执行。
我必须对代码进行哪些更改才能停止程序的执行?
没有oldNum
的检查代码可以正常工作。有没有提供oldNum
检查的逻辑?
如果我从Line-a中删除Thread.sleep(1000L)
,那么它只会打印“偶数线程打印20”并继续执行。这是怎么回事?
run()
方法内部和main方法的for循环内部提供的断点,run()
方法的断点没有命中。为什么会这样?
简而言之,我想知道这里的代码流是什么。
谢谢
维卡什
public class PrintOddEvenUsingInterrupt {
public static volatile int count;
public static void main(String[] args) throws InterruptedException {
Thread oddThread = new Thread(new OddInterruptThread(), "Odd Thread ");
Thread evenThread = new Thread(new EvenInterruptThread(),"Even Thread ");
oddThread.start();
evenThread.start();
for (int i = 0; i < 20; i++) {
count++;
oddThread.interrupt();//Break points works here
evenThread.interrupt();
Thread.sleep(1000L);// Line-a
}
}
static class OddInterruptThread implements Runnable {
public void run() {
int oldNum = 0;//Break points doesn't works here
while (true) {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
}
if (oldNum != count && count % 2 == 1) {
System.out.println(Thread.currentThread().getName()
+ " prints " + count);
oldNum = count;
}
}
}
}
static class EvenInterruptThread implements Runnable {
public void run() {
int oldNum = 0;//Break points doesn't works here
while (true) {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
}
if (oldNum != count && count % 2 == 0) {
System.out.println(Thread.currentThread().getName()
+ " prints " + count);
oldNum = count;
}
}
}
}
}
答案 0 :(得分:2)
程序未停止的原因是:当主线程退出时,奇数和偶数线程会陷入无限循环。
您将需要定义一个停止条件,线程才能出来。
实现此目标的一种方法是通过使用条件。 例如:
public volatile static boolean oddFinished = false;
public volatile static boolean evenFinished = false;
然后在您的线程中而不是无限循环,而是针对条件循环 而(!oddFinished){ //还可以将线程睡眠状态更改为睡眠较少的时间间隔(例如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();
这将使您的代码正常停止。
答案 1 :(得分:0)
我认为最简单的解决方案是使线程恶魔化。 只需在开始之前添加以下几行即可。
oddThread.setDaemon(true);
evenThread.setDaemon(true);
您的程序将从main退出后立即退出。