我有一个接收对象的回调。我复制了该对象,并且必须将其传递给另一个线程以进行进一步处理。回调尽可能快地返回非常重要。理想情况下,回调会将副本写入某种无锁容器。
我只从一个线程和一个处理线程调用回调。
我只需要将一堆 double 传递给另一个线程,并且我知道 double 的最大数量(大约 40 个)。
有什么想法吗?我对Java不太熟悉,所以我不知道在线程之间传递东西的常用方法。
最佳答案
如果这只是一次性的事情 - 你得到 40 左右的 double ,并且想要启动一个新线程处理它,那么你可以这样做:
public void callback(final double[] myDoubles)
{
new Thread(){
public void run() {
// you can use myDoubles here. it will run on a separate thread.
}}.start()
};
如果这种情况经常发生,那么您需要查看 thread pools并使用 java.utils.concurrent.BlockingQueue 。尽管有这个名字,队列只有在变满时才会阻塞。
您可以创建一个由回调方法放入队列的适当大小的 double 组。 put() 操作非常快,因此您的回调方法不会延迟太久。 (除非队列已满。)
当对象可用时,您的另一个线程将使用队列上的 take() 方法来获取对象。 take() 方法会阻塞,直到有一个对象可用为止 - 如果您不希望这样,但希望保持线程运行,做其他事情,则可以使用 poll() 代替。
最后要考虑的一件事是 - 您是否只需要一个工作线程处理回调中的 double ,还是需要多个工作线程?当工作需要一次完成一个时,拥有一个线程是有意义的 - 例如如果将数组写入文件,那么通常没有必要让多个线程执行此操作。如果每个数组上完成的工作是独立的,那么它是拥有多个工作线程的良好候选者。
关于java - 将简单的java对象从一个线程传递到另一个线程的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2925115/