这就是我想要做的:


带有开始/停止按钮的用户界面,
单击开始/停止时,启动或停止类方法。


此类方法是调用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对象不再
一个线程。那时,它只是一个对象,与其他所有对象一样
对象。

但是,有一些设计模式可以使
您可以继续用来执行不同操作的线程
工作。但是您不能通过重启死线程来做到这一点。

09-30 12:28
查看更多