当前位置: 首页 > 面试题库 >

如何在Java中以快速干净的方式中止线程?

龙正初
2023-03-14
问题内容

这是我的问题:我有一个对话框,其中包含一些用户可以更改的参数(例如,通过微调器)。每次更改这些参数之一时,我都会启动一个线程以根据新的参数值更新3D视图。如果在第一个线程正在工作时用户更改了另一个值(或通过单击微调箭头多次再次更改了相同的值),我想中止第一个线程(以及3D视图的更新)并启动一个新线程具有最新的参数值。

我该怎么做?

PS:run()我的线程的方法中没有循环,因此检查标志不是一个选择:更新3D视图的线程基本上只调用执行时间很长的单个方法。我无法在此方法中添加任何要求中止的标志,因为我无权访问其代码


问题答案:

如某些人所述,尝试使用interrupt()来查看它是否对您的线程有任何影响。如果不是,请尝试破坏或关闭将使线程停止的资源。这比尝试抛出Th​​read.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;
}


 类似资料:
  • 我终于在我的程序中实现了Thread.interrupt()而不是Thread.stop()。然而,我不确定我做得好不好。 我有一个类,它扩展了Thread并声明了几个方法。每个方法都抛出InterruptedException(每个方法都执行I/O密集型操作,其中一些需要几分钟才能完成,因此我没有使用线程安全标志,因为该标志直到操作完成后才会被检查)。我还在这些方法的几个地方添加了以下代码来抛出

  • 问题内容: 我对Swift和Xcode还是比较陌生,我正在尝试制作tic TAC Toe游戏。除了如何通过三个x或o画一条线外,我已经弄清楚了一切。我不知道如何画线。我已经在网上寻找了答案,却找不到答案。 问题答案: 尝试研究UIBezierPath,它将对您画线有很大帮助。这是文档。这是一个例子: 确保像上面的示例一样,将此代码放在中。 如果您需要更新工程图,只需致电进行更新。

  • 问题内容: 如何通过UIViewController扩展的任何类以编程方式创建选项卡: 问题答案: 更新SWIFT 5 如何以编程方式创建的一个示例如下所示: 首先,我们创建标签栏界面的每个标签的内容。对于此示例,我们仅创建一个非常简单的示例。 现在,: 我们创建了要显示在标签栏中的的新实例。然后,我们为创建的每个实例创建一个图标,然后创建一个数组,其中包含所有为标签栏界面的每个标签指定内容的数组

  • 我是Android Studio的新手,所以我面临一些问题。我正在寻找一种如何干净地项目的方法。 在Eclipse中,我会做<代码>项目-

  • 问题内容: 我正在实现一个简单的眼动仪,它需要对屏幕上正在发生的事情进行快速屏幕截图,并同时从网络摄像头捕获视频。 顺便说一句,从网络摄像头检索视频的速度更快,并且返回字节数组,该字节数组的处理速度非常快。 有人知道更快的解决方案吗?可以链接到Java的C ++库也可能会有所帮助。 谢谢! 更新:决定切换到OpenCV,现在正在寻找使用它制作屏幕截图的方法:) 问题答案: 你绝对应该对OpenCV

  • 问题内容: 我已经用GUI制作了一个Java程序,并且想要一个停止按钮功能,其中当用户单击停止按钮时,必须停止该程序。 在我的程序中,主线程启动其他10个线程,我希望每当单击“停止”按钮时,所有10个线程都必须在主线程之前停止。 其次,我还希望每当停止这10个线程中的任何一个线程时,它都必须先关闭它打开的所有资源,然后再连接数据库等。 我已经实现了.......回答的代码。 现在有一个问题。 我的