如何在用户命令停止时停止的Java命令提示符中停止某个线程?

时间:2012-10-19 07:49:01

标签: java multithreading

基本上,我有一个在无人控制台上运行的Java线程,除非用户输入“halt”,程序应该停止线程并停止控制台。

这是线程类型的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; }

我看的每个地方都说要使用中断,但这个中断似乎不起作用。有人有任何想法吗?或者我只是忽略了一些小细节?我有可能需要使用套接字来解决这个问题。

4 个答案:

答案 0 :(得分:0)

中断只会中断您中断的线程。在您的代码中,您创建了中断的线程,但不会影响其他线程。

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

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

答案 1 :(得分:0)

查看ScheduledExecutorService,它可用于管理您的任务。使用执行程序服务可以使Java中的多线程直播变得更容易:)

答案 2 :(得分:0)

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

您正在尝试停止当前正在执行的任务。一种更简单的方法是: 如果您希望终止任务,则设置为AtomicBoolean dontKeepRunning变量。

像这样:

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);    
}

答案 3 :(得分:0)

在所有主题上发布Thread.interrupt。这些主题必须support interruption。基本上线程必须:

  1. 不时测试中断标志,例如使用Thread.currentThread.isInterrupted()
  2. 收到InterruptedException
  3. 后结束