gpt4 book ai didi

java - 计时器到期后停止并启动新线程

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

这是我在 Stackoverflow 上的第一篇文章,显然我对线程了解不多。它是一个控制台应用程序,问题是,当主方法启动时,计时器也会启动并且我的程序执行,它涉及从键盘获取信息并且效果很好。

计时器到期后,假设 20 秒后,它会从 RemindTask 类调用 run() 并显示在此期间收集的点数。现在,之后我想再次选择启动不启动我的应用程序,主要方法。

事情是我的 main 仍然会从键盘收集信息,因为它仍在执行,而不是从我想要的 run() 方法的输入中收集信息。如果我放置 System.exit(0),当然我无法在它之后启动新线程。我如何通过这个,有没有办法在我的 while 循环中说“直到我的计时器没有过期才这样做”?或者什么?

static class RemindTask extends TimerTask {
public void run() {
char answer;
System.out.println("Time expired! "+yourResult);
/* System.exit(0);
Thread t = new Thread();
t.start(); */
System.out.println("Do you continue? y/n");
Scanner in = new Scanner(System.in);
answer = in.nextLine().charAt(0);
if(answer=='y'){
System.out.println("Continue program");
String[] args = {};
Main.main(args);
}else
System.out.println("Stoping program");
System.exit(0); //Stops the AWT thread (and everything else)
}

}

static int yourResult;
public static void main(String[] args) {

int seconds=20;
timer = new Timer();
timer.schedule(new RemindTask(), seconds * 1000);
boolean contin = true;


while(contin == true){

//...a bunch of code...
//...Scanner in = new Scanner(System.in);..
//...a bunch of code...

}

最佳答案

停止线程并不是一项简单的任务。如何停止线程的简短答案是:不要从另一个线程中停止一个线程;相反,要求线程自行停止。这样做的原因是线程必须停止在安全的地方。例如,如果停止的线程持有互斥锁,则如果另一个线程也需要该互斥锁,则可能会发生死锁。

首先,最好不要使用 main 方法来轮询键盘。只需创建另一个线程来执行此操作即可;这使得稍后创建新线程执行相同的操作变得更容易。

其次,您要做的是将主线程的 Thread 对象的引用传递给您的 RemindTask 线程。 Java 提供了一个方法 Thread.stop() 来停止线程,但由于我上面给出的原因,它已被弃用。

相反,您必须要求主线程停止。 Java 提供了执行此操作的标准方法。您在主线程的 Thread 实例上调用 Thread.interrupt() 。然后,在主线程中定期调用静态方法Thread.interrupted()。如果它返回 true,这意味着其他线程已要求当前线程终止,您可以通过从 run() 方法返回来彻底停止。

关于java - 计时器到期后停止并启动新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26429616/

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