基本上,我有一个在无人控制台上运行的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;
}
我看的每个地方都说要使用中断,但这个中断似乎不起作用。有人有任何想法吗?或者我只是忽略了一些小细节?我有可能需要使用套接字来解决这个问题。
答案 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。基本上线程必须:
Thread.currentThread.isInterrupted()
InterruptedException