【问题标题】:How to execute only one thread and receive a Future without creating an ExecutorService?如何在不创建 ExecutorService 的情况下只执行一个线程并接收 Future?
【发布时间】:2017-05-23 12:31:45
【问题描述】:

我只需要执行一个能够取消它的线程。我发现我可以使用Future<T>s 来实现这一点。现在我像这样使用它:

ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<Void> future = executorService.submit(copyCallable);
executorService.shutdown();

由于ExecutorServices 通常用于管理多个线程,我想知道是否有更有效的方法来实现这一点而无需创建一个。谢谢。

【问题讨论】:

  • ExecutorService 不会帮助取消创建的线程,您必须自己管理。至于等待输出,你可以在调用者线程中调用new thread().join()
  • 在 android 类中 AsyncTask 就是为此而生的。通常一次只在gui线程外执行一个AsyncTask,AsyncTask.doInBackground()完成后在gui线程中执行AsyncTask.onPostExecute。
  • 为什么要关心它是否高效?以你的方式做这件事看起来是对你的时间的有效利用。其他任何事情只会迫使您编写更多代码行,并且可能会迫使其他程序员有一天阅读更多代码行。您的程序的性能是否不尽如人意?如果没有,那为什么不停下来享受它呢?
  • @11thdimension 我假设future.cancel(true) 会神奇地停止线程,即使没有明确处理取消。经过一番研究,我发现我需要在Callable 中自己处理取消,或者只使用常规线程并自己处理中断。我认为后一种方法比创建ExecutorService 更有效。
  • @k3b 此操作运行时间较长,因此我选择创建自己的线程。

标签: java android multithreading future executorservice


【解决方案1】:

Interryprion 由线程和调用方法实现。您的线程需要在方便的时间点侦听 InterruptedException 或检查中断标志。调用代码应该调用 t.interrupt() 来通知线程它应该停止。

【讨论】:

  • 这是要走的,我使用Future只是为了cancel()的能力,我仍然必须处理,就像普通的Thread一样,还不如使用常规线。谢谢!
猜你喜欢
  • 2020-07-28
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
相关资源
最近更新 更多