java - 将简单的java对象从一个线程传递到另一个线程的快速方法

标签 java performance multithreading nonblocking

我有一个接收对象的回调。我复制了该对象,并且必须将其传递给另一个线程以进行进一步处理。回调尽可能快地返回非常重要。理想情况下,回调会将副本写入某种无锁容器。

我只从一个线程和一个处理线程调用回调。

我只需要将一堆 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/

相关文章:

java - Spring单例线程安全

java - 如何使用 JAXB 使用 Jersey 1.6 生成 JSON 输出

java - 在现有的大型 Java 代码库中构建测试套件

java - 如何更改 CA SDM 中变更单的子工作流的状态?

performance - Haskell 对于游戏等软实时应用程序的 GC 性能如何?

multithreading - 为什么必须始终从 UI 线程创建/更新 UI 元素?

Java之前如何用小输入屏幕抓取?

java - 对 lambda 表达式的随机搜索

python - 为什么从元组列表创建 python 字典比从 kwargs 慢 3 倍

c++ - 了解使用 std::condition_variable 的示例