如何获取特定线程上的对象?
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;
}
}
我有一个由 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;
}
}