这是我的问题:我有一个对话框,其中包含一些用户可以更改的参数(例如,通过微调器)。每次更改这些参数之一时,我都会启动一个线程以根据新的参数值更新3D视图。如果在第一个线程正在工作时用户更改了另一个值(或通过单击微调箭头多次再次更改了相同的值),我想中止第一个线程(以及3D视图的更新)并启动一个新线程具有最新的参数值。
我该怎么做?
PS:run()我的线程的方法中没有循环,因此检查标志不是一个选择:更新3D视图的线程基本上只调用执行时间很长的单个方法。我无法在此方法中添加任何要求中止的标志,因为我无权访问其代码。
run()
如某些人所述,尝试使用interrupt()来查看它是否对您的线程有任何影响。如果不是,请尝试破坏或关闭将使线程停止的资源。这比尝试抛出Thread.stop()更好。
如果性能是可以忍受的,则可以将每个3D更新视为离散的不间断事件,并让其运行到结论,然后检查是否有新的最新更新要执行。这可能会使GUI变得有些混乱,因为用户将能够进行五处更改,然后查看五处更改之前的图形结果,然后查看其最新更改的结果。但是,根据此过程的时间长短,它可能是可以容忍的,并且可以避免不得不杀死线程。设计可能如下所示:
boolean stopFlag = false; Object[] latestArgs = null; public void run() { while (!stopFlag) { if (latestArgs != null) { Object[] args = latestArgs; latestArgs = null; perform3dUpdate(args); } else { Thread.sleep(500); } } } public void endThread() { stopFlag = true; } public void updateSettings(Object[] args) { latestArgs = args; }