【问题标题】:Java How to uniquely identify a Runnable being executed in a ThreadJava如何唯一标识线程中正在执行的Runnable
【发布时间】:2018-07-04 01:15:51
【问题描述】:

我想找到一种在执行期间识别 Runnable 实例的方法。基本上我正在创建一个临时缓存,线程可以通过 ThreadLocal 访问它,但是将它绑定到线程是不够的,因为我的应用程序正在使用线程池,因此同一个线程将被一遍又一遍地重用。由于传递给线程的 Runnable 不会被重用,我想找到一种方法来获取 Runnable,以便我可以在执行期间识别相同的可运行对象。它将用作 Map 的键,因此即使只是从 toString() 的返回就足够了。

我没有创建线程池,线程是从多个池中创建的,所以如果可能的话,我宁愿不尝试增加 Thread / Runnable 创建过程。

我似乎找不到从 Thread.currentThread() 获取任何有用信息的方法,但如果可能的话,最好使用它。

【问题讨论】:

  • 你不能使用ThreadLocal并在任务完成时清除它吗?

标签: java multithreading runnable


【解决方案1】:

如果您想使用Thread.currentThread(),您可以检查线程的stack trace,这将允许您确定正在运行的内容。如果你为每个任务子类Runnable,你可以很容易地确定哪个runnable正在执行。否则,您可以更深入地检查堆栈(即可运行的代码正在调用的任何代码)以启发式地确定正在执行的内容。

【讨论】:

  • 嗯,它不是很灵活,是吗?如果他想运行多个任务实例怎么办?以及所有与堆栈跟踪和子类有关的东西......
  • 我想到了这个,但它有点笨拙,我不确定提取堆栈跟踪会有多昂贵。这种操作会经常发生,如果拉栈跟踪成本很高,只是为了尝试获取一个id,它最终会失败。
  • 您可以考虑发布一个单独的问题,详细了解您的身份actually trying to accomplish;需要反复检查线程的状态以查看它在做什么(调试除外)是非常不寻常的,并且似乎不是正确的方法。然而,如果不了解更多关于基本目标的信息,就很难提供更好的选择。
【解决方案2】:

使用Map,其值为Runnables,其键为System.identityHashcode()。不完美,但尽你所能。

或者让每个Runnable 都有自己的UUID 属性并将其用作键。现在这很完美。但更贵。

【讨论】:

  • 我认为您误解了这个问题。 OP 想要访问当前正在执行的 Runnable 实例。 Runnable.currentRunnable() 之类的东西,如果存在的话。
  • @shmosel 不,但显然我没能说清楚。
  • @shmosel,是的。在任何时候,我都想确定当前正在执行的可运行文件。所以如果我给一个runnable一个id,我将如何获得对该id的访问权,甚至是为了获得该id而访问runnable?
猜你喜欢
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多