如何获取特定线程上的对象?

How to get the object on a specific thread?

我有一个由 ThreadPoolExecutor.execute

创建的 运行nable

例如:

class myObj implements Runnable{{
   int m_id;
   myObj(int id) {n_id = id}
   @Override
    public void run() { }
}

m_threadPoolTaskExecutor.execute(
    new myObj(9);
);

那么在 运行 之后,我怎样才能从该线程获取 myObj 实例?那么我可以遍历线程池并找到与 m_id == 9 匹配的 mObj 吗?

Threads是Runnable,但并不是所有的Runnables都是Threads。当您将 Runnable 提交到线程池时,期望池提供实际线程,您的 Runnable 只是一个旨在由某个线程执行的任务。当分配给您的任务的线程池工作者完成处理它时,它会获取另一个任务并且不再有您的 Runnable。

您可以保留对您的 Runnable 的引用,但是您必须处理跨线程进行的更新,并且我们必须处理使用 volatile、AtomicInteger 或其他任何内容。您的代码不仅会自动看到另一个线程所做的更改,JVM 还需要它查找的特定标志。将一个 runnable 提交到池中,然后再查看 runnable 的整个模型非常丑陋 error-prone.

如果您将 Runnable 更改为 Callable 并让它使用 Future 来 return 您需要返回的 int,那么内存可见性问题将为您处理。

将 Callable 传递给 the ExecutorService submit method that returns a Future。您可以在 Future 上调用 isDone 以查看任务是否已完成,然后调用 get 以从 Callable 中检索值 returned。

我不清楚您希望在任务执行后在任务中找到什么。我的建议是用你想要的值创建一个单独的不可变对象。在这里我称它为 MyResult。所以 Callable 看起来像这样:

class MyObj implements Callable<MyResult> {{
    
    int m_id;
    MyObj(int id) {n_id = id}
    
    @Override
    public MyResult call() { 
        return new MyResult(1,2);
    }
}

class MyResult {
    final val1;
    final val2;
    public MyResult(int val1, int val2) {
        this.val1 = val1;
        this.val2 = val2;
    }
}