这就是我想要做的:
带有开始/停止按钮的用户界面,
单击开始/停止时,启动或停止类方法。
此类方法是调用scheduleAtFixedRate
的方法,还包含一会儿检查条件的方法。这将循环直到找到条件为止。
我怎样才能使整个过程由用户控制(以一种好而有效的方式)?
最佳地,我想这样做:
启动并调用启动方法
停止并调用清理方法
如果我直接从UI调用该方法,它将冻结它(由于while循环)。
现在,我尝试从新线程的run()
方法内部调用该方法,
这样就可以了,但是当停止并再次调用线程时,会抛出IllegalThreadStateException
。
我也试过if (thread.isAlive()) { mainThread = new Thread(mainThread);}
但这也不起作用(它会引发与以前相同的错误)。
我能做什么?我试图不使我称为线程/可运行的方法,因为它将用try / catches填充一半(使代码几乎不可读)。
编辑:
这就是我想出的。如前所述,它第二次不起作用。
缺少变量很简单,可以推断出来。
用户界面代码:
//Other code
//Thread
mainThread = new Thread(new Runnable() {
@Override
public void run() {
try
{
magicalManager.execute(2);
}
catch (Exception e){}
}
});
ActionListener StartStopAL = new ActionListener()
{
public void actionPerformed(ActionEvent actionEvent)
{
if (startButtonStatus == false) {
startButton.setText("Start");
startButtonStatus = true;
mainThread.interrupt();
TaskScheduler.getScheduledExecutorService().shutdown();
}
else if (startButtonStatus == true) {
startButton.setText("Stop");
startButtonStatus = false;
if (mainThread.isAlive()) {
mainThread = new Thread(mainThread);
}
mainThread.start();
}
}
};
//Add action listener to startButton
//Other code
班级代码:
public class magicalManager
{
public static void execute(int ID) throws Exception {
//run scheduleAtFixedRate
while(...)
{
if (...){
break;
}
}
return
}
public static void KillManager(){
//kill scheduleAtFixedRate
}
}
最佳答案
线程的run()
方法完成后,
该线程永远无法重新启动。实际上,
点线程将进入死状态。在死状态下,永远无法重新启动线程。
线程对象可能仍在堆上,因为
您可以在其上调用其他方法的活动对象(如果
适当),但Thread对象具有永久性
失去了它的“线程性”。换句话说,不再有
单独的调用堆栈,并且Thread对象不再
一个线程。那时,它只是一个对象,与其他所有对象一样
对象。
但是,有一些设计模式可以使
您可以继续用来执行不同操作的线程
工作。但是您不能通过重启死线程来做到这一点。