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

标签 java multithreading timer

这是我在 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/

相关文章:

javascript - Processing.js 计时器

java - 复制数组的值

ios - 我们可以允许从两个线程同时操作 NSMutableArray 的不同 "indexes"

java - 在 Java 中调整 base64 字符串图像的大小

c++ - 让线程等待内存中值更改的有效方法?

python停止多线程回显服务器

c - 如何正确使用timerfd?

php循环内的javascript倒计时器不工作

java - 实现接口(interface)时获得与父类(super class)相同的接口(interface)

java - Java中没有顶级类的情况下访问非顶级类