如何在Java中正确地启动暂停和停止线程



我开始播放"Java中的线程并想知道我的解决方案与开始暂停和停止线程…

开始和暂停工作每次(我认为)很好,但当我做停止方法我得到异常:

. lang。InterruptedException: sleep interrupted

但是在那之后就停止了(i think so)

这是我的超级简单的代码:)

带有按钮的代码片段:

var ref = new Object() {
Thread th = new Thread(main);
};
startItem.addActionListener(e -> {
if (ref.th.getState() == Thread.State.NEW)
ref.th.start();
else
main.setPaused(false);
});
pauseItem.addActionListener(e -> {
if (ref.th.getState() == Thread.State.TIMED_WAITING)
main.setPaused(true);
});
stopItem.addActionListener(e -> {
main.setRunning(false);
ref.th.interrupt();
ref.th = new Thread(main);
});

这里是我的Runnable类:

public class MyRunnable implements Runnable {
private volatile boolean running;
private volatile boolean paused;
@Override
public void run() {
Logger.info("MONITORING STARTED");
running = true;
paused = false;
int counter = 0;
while (running) {
if (!paused) {
sleep();
System.out.println("thread working: " + counter);
counter++;
}
}
}
public void setRunning(boolean running) {
if(!running)
Logger.info("MONITORING STOPPED");
this.running = running;
}
public void setPaused(boolean paused) {
if(paused)
Logger.info("APPLICATION PAUSED = TRUE (paused)");
else
Logger.info("APPLICATION PAUSED = FALSE (continues to work...)");
this.paused = paused;
}
private void sleep() {
try {
Thread.sleep(1000);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

我做对了吗?

或者这是一个愚蠢的方法,我应该做不同的使它正确吗?

每当我"流汗"的时候一些代码,我想知道我是否做得很好,正确的方式…这是缺乏技能和专业精神的表现。

提前感谢您的帮助和耐心,并为我的英语感到抱歉。:问候。

您的线程正在打印错误消息,因为您编写了ex.printStackTrace()。这就是printStackTrace()的作用:你用它来引起对意外异常的注意。

但是如果你的其他线程调用ref.th.interrupt(),那么异常真的是意想不到的吗?没有规则规定每次代码处理异常时都必须调用printStackTrace()。看起来您已经在使用Log4J了,所以一种选择是调用Logger.info("interrupted", ex)。另一个选择是在处理程序中什么都不做,因为在处理程序完成后,线程最终*将检查running标志。


*个人而言,我会将sleep()调用移动到循环的底部,因为这样,如果sleep()被中断,它不会打印"工作";或者再次增加计数器,直到线程未暂停。

while (running) {
if (!paused) {
System.out.println("thread working: " + counter);
counter++;
sleep();
}
}

更好的是:将sleep()if语句中移出,这样线程在"暂停"时就不会消耗100%的CPU时间(正如@MadProgrammer在评论中提到的)。

while (running) {
if (!paused) {
System.out.println("thread working: " + counter);
counter++;
}
sleep();
}

最新更新