1

基本上,我有一个在控制台中运行的 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; }

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

4

4 回答 4

0

在您的所有线程上发布Thread.interrupt。而且这些线程必须支持中断。基本上,线程必须:

  1. 不时测试中断标志,例如使用Thread.currentThread.isInterrupted()
  2. 接收完毕InterruptedException
于 2012-10-19T08:28:30.367 回答
0

为什么不将计时器移出函数并进入类范围?然后调用timer.purge()or 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);    
}
于 2012-10-19T08:23:36.813 回答
0

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

您可以在 Timer 中中断线程,除非您记录中断但继续,就好像它没有发生一样,即它不会停止线程。

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

于 2012-10-19T08:00:22.770 回答
0

看看ScheduledExecutorService,它可以用来管理你的任务。使用执行器服务使 Java 中的多线程生活更容易:)

于 2012-10-19T08:02:16.890 回答