gpt4 book ai didi

java - 主线程没有被中断

转载 作者:行者123 更新时间:2023-12-01 15:08:23 25 4
gpt4 key购买 nike

我编写了一个代码,如果正在测试的数字是一个快乐的数字,则打印 1,否则打印 0。

class Ishappy extends Thread {
private Integer num;
private Thread main;
private volatile boolean out = false;

Ishappy(int i, Thread main) {
this.main = main;
num = i;
}

void Exit() {
out = true;
}

@Override
public void run() {
while(!out && num != 1) {
if(num == 1) {
main.interrupt();
break;
}

String s = num.toString();
int temp = 0;
for(int i = 0 ; i < s.length(); i++) {
int x = Integer.parseInt(s.substring(i, i+1));
temp += x*x;
}
num = temp;
}
}
}

public class Happy_numbers {
public static void main(String[] args) {
byte path[] = null;

String s = "d:\\data.txt";

try(FileInputStream fin = new FileInputStream(s)) {
InputStreamReader in = new InputStreamReader(fin);
BufferedReader br = new BufferedReader(in);
s = br.readLine();
int num;
while(s != null) {
num = Integer.parseInt(s);

Ishappy ishappy = new Ishappy(num,Thread.currentThread());
ishappy.start();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
System.out.println(1);
continue;
}
if(ishappy.isAlive()) {
ishappy.Exit();
System.out.println(0);
} else
System.out.println(11);

s = br.readLine();
}
} catch (FileNotFoundException ex) {
System.out.println("File not found.");
}catch(IOException ex){
}
}
}

但是上面的代码总是打印 11 作为一个快乐的数字,这意味着 main 永远不会被中断。怎么了??

data.txt的内容是

1
7
22

其中 1 和 7 是快乐数字,而 22 则不是。

最佳答案

当我阅读您的程序时,第一次通过主循环,将 fork 一个新的 IsHappy 线程,并将 num 设置为 1 。在 IsHappy.run() 方法中,如果 num1 则立即退出。

while(!out && num != 1)

main 将 hibernate ,然后打印 11,因为线程不再运行。

if(ishappy.isAlive()) {
ishappy.Exit();
System.out.println(0);
} else
System.out.println(11);

这不是你所期望的吗?我认为你应该学习如何使用调试器。这是一个关于如何 debug your program in Eclipse 的很好的教程.

如果处理数字 7,则 IsHappy.run() 方法将旋转,将 num 设置为 49 (7*7) 一遍又一遍。然后,main 将看到 IsHappy 仍然存在,并将调用 IsHappy.Exit() 并打印 0

如果处理数字 21,则 IsHappy.run() 方法将旋转,将 num 设置为 5 (2*2+1*1) 一遍又一遍。 main 将再次 Exit() 线程并打印 0

所以我猜你的输出是:

11
0
0

main 线程永远不会被中断,因为如果 num == 1while 循环将停止它的运行。

关于您的代码的一些其他评论。这可能是测试代码,所以没关系,但要迂腐:

  • 永远不要捕获并丢弃异常(请参阅您的 IOException catch)。至少在空的 catch block 中添加注释,解释为什么您不关心异常。
  • 您的线程正在旋转进行计算。这显然不是一种很好的资源利用方式。
  • 您没有关闭任何输入流或阅读器。处理这些问题时始终使用 try/finally。
  • Exit() 方法应以小写字母开头。该方法的更好名称是 stop

关于java - 主线程没有被中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12657428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com