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

时间:2014-10-17 16:39:05

标签: java multithreading timer

这是我在Stackoverflow上的第一篇文章,显然我对线程知之甚少。 它是一个控制台应用程序,事情是,当主方法启动时,计时器启动,我的程序执行,它涉及从键盘获取信息,它工作得很好。

在计时器到期后,让我们说在20秒后,它从RemindTask类调用run()并显示我在此期间收集的点数。 在此之后,我想再次选择开始不再开始我的应用,主要方法。

东西是我的主要仍然会从键盘收集信息导致它仍在执行而不是来自我想要的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...

        }

2 个答案:

答案 0 :(得分:1)

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

首先,您可能最好不使用main方法轮询键盘。只需创建另一个线程来执行此操作;这使得以后更容易让新线程做同样的事情。

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

相反,你必须要求主线程停止。 Java提供了一种标准的方法。您在主线程的Thread.interrupt()实例上调用Thread。然后,在主线程中,您经常调用静态方法Thread.interrupted()。如果它返回true,这意味着某个其他线程已经要求当前线程终止,并且您可以通过从run()方法返回来干净地停止。

答案 1 :(得分:0)

如果没有调用RemindTask.run()方法,很难得到问题所在。在代码的注释部分,在main方法循环中,你有一个构造函数调用,它也在RemindTask.run()中。也许这是问题的一部分?