这就是我想要做的事情:
此类方法是一种调用scheduleAtFixedRate
并且还包含检查条件的while的方法。这循环直到找到了条件。
如何让用户控制整个过程(以一种好的有效方式)?
最好我想这样做:
启动并调用启动方法
停止并致电清理方法
如果我直接从UI调用该方法,它会冻结它(因为while循环)。
现在,我尝试从新的Thread run()
方法中调用该方法,
这是有效的,但是当停止并再次调用线程时,会抛出IllegalThreadStateException
。
我也试过if (thread.isAlive()) { mainThread = new Thread(mainThread);}
但这也不起作用(它抛出与以前相同的错误)。
我该怎么办?我试图不使用我称之为线程/ runnable的方法,因为它会用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
}
}
答案 0 :(得分:1)
一旦线程的<div class="duplicate">
<div class="row">
<div class="col-md-4">
<div class="form-group">
<input class="form-control" type="text"
name="contribution[item_name]">
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="item_quantity">Number of items</label>
<input min="1" class="form-control"
type="number" value="1"
name="contribution[item_quantity]">
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="contribution[item_type]">Category</label>
<select class="form-control"
name="contribution[item_type]">
<option value="1">Entrée</option>
<option value="2">Plat</option>
<option value="3">Dessert</option>
<option value="4">Softs</option>
<option value="5">Alcool</option>
<option value="6">Autres</option>
</select>
</div>
<a href="#" class="button-remove">
Remove item
</a>
</div>
</div>
</div>
<button class="btn-add">
Add new row
</button>
方法完成,
线程永远不能重新启动。事实上,在那
指向线程进入死态。在死状态下,线程永远不能重新启动。
Thread对象可能仍然在堆上,因为 你可以调用其他方法的生物对象(如果 适当的),但Thread对象具有永久性 失去了它的“线程”。换句话说,不再是一个 单独的调用堆栈,不再是Thread对象 一个线程。这只是一个对象,就像其他所有对象一样 对象。
但是,有一些设计模式可用于制作游戏池 您可以继续使用以执行不同的线程 工作。但是你没有通过重新启动死线程来实现它。