2012-10-19 40 views
1

基本上,我有一个运行在控制台中的Java线程,这个线程将无限移动,除非用户输入“halt”,程序应该停止线程并停止控制台。如何在用户命令停止的Java命令提示符中停止线程?

这里就是线程样貌似的set_interval部分(用户可以给的输入他们是如何的间隔长要在线程之间):

public void set_interval(int mins, int secs) { 
    time = (mins * 60000) + (1000 * secs); 
    Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 
     public void run() { 
      try { 
       count += counter; 
       String name = getName(); 
       Date date = new Date(); 
       System.out.print("\n" + "Thread:" + name + " " + date + " - counter: " + count); 
       Thread.sleep(time); 
      } catch(InterruptedException e){ 
       System.out.print(e); 
      } 
    }, 0, time);  
} 

,这里是什么样的主要款式:像: }else if (checkLine.equals("halt")){ Thread test = new Thread("name"); test.interrupt(); break; }

我看每个地方说要使用中断,但这个中断似乎并没有工作。任何人有任何想法?或者我只是忽略了一些小细节?有机会我需要使用套接字来解决这个问题。

回答

0

中断只会中断您中断的线程。在你的代码中你创建了一个你打断的线程,但是没有其他的线程会受到影响。

除了记录中断之外,您可以中断定时器中的线程,但继续执行,就好像它没有发生,即不会停止线程。

我会为此使用ScheduleExecutorService,因为它支持shutdownNow(),它会停止线程池并中断所有正在运行的任务。

+0

我不使用可运行,可我还是用ScheduleExecutorService? – user1758415

+0

您可以将run()方法中的内容放入Runnable中,并删除Thread.sleep,因为它不需要。 –

0

为什么不将定时器移出函数并进入类范围?然后致电timer.purge()timer.cancel()? - 但坚持!他们只停止/取消所有非活动任务。目前正在执行的任务将永远不会停止。

您正试图停止当前正在执行的任务。一个更简单的方法是: 有一个AtomicBoolean dontKeepRunning变量,当您想要终止任务时,您将其设置为true。

像这样:

private AtomicBoolean dontKeepRunning; 
public YourTimerTask(){ dontKeepRunning = new AtomicBoolean();} 
public void halt() 
{ 
    dontKeepRunning.set(true); 
} 
public void set_interval(int mins, int secs) { 
    time = (mins * 60000) + (1000 * secs); 
    Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 
     public void run() { 
      try { 
       count += counter; 
       String name = getName(); 
       Date date = new Date(); 
       System.out.print("\n" + "Thread:" + name + " " + date + " - counter: " + count); 
       while(dontKeepRunning.get() == false){} 
       return; 
      } catch(InterruptedException e){ 
       System.out.print(e); 
      } 
    }, 0, time);  
} 
+0

当我在我的主要Java类中调用(ThreadName).halt()时,它仍然不会阻止线程继续... – user1758415

+0

@ user1758415试试这个吗? –

0

问题Thread.interrupt在所有的线程。而这些线程必须support interruption。基本上,线程必须:

  1. 试验中断标志不时,例如与Thread.currentThread.isInterrupted()
  2. 完成对接收InterruptedException