杀死并清理调用方法的线程?

时间:2018-03-18 17:52:05

标签: java multithreading

这就是我想要做的事情:

  • 带开始/停止按钮的UI,
  • 单击开始/停止时,启动或停止类方法。

此类方法是一种调用scheduleAtFixedRate并且还包含检查条件的while的方法。这循环直到找到了条件。

如何让用户控制整个过程(以一种好的有效方式)?

最好我想这样做:

  • 启动并调用启动方法

  • 停止并致电清理方法

如果我直接从UI调用该方法,它会冻结它(因为while循环)。

现在,我尝试从新的Thread run()方法中调用该方法, 这是有效的,但是当停止并再次调用线程时,会抛出IllegalThreadStateException

我也试过if (thread.isAlive()) { mainThread = new Thread(mainThread);} 但这也不起作用(它抛出与以前相同的错误)。

我该怎么办?我试图不使用我称之为线程/ runnable的方法,因为它会用try / catches填充一半(使得代码几乎不可读)。

编辑: 这就是我提出的。如上所述它第二次不起作用。 缺少变量很简单,可以推断出来。

UI代码:

//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
    }
}

1 个答案:

答案 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对象 一个线程。这只是一个对象,就像其他所有对象一样 对象。

但是,有一些设计模式可用于制作游戏池 您可以继续使用以执行不同的线程 工作。但是你没有通过重新启动死线程来实现它。