java - 从 Java 线程返回值

标签 java multithreading concurrency

我有一个如下的 Java 线程:

   public class MyThread extends Thread {
        MyService service;
        String id;
        public MyThread(String id) {
            this.id = node;
        }
        public void run() {
            User user = service.getUser(id)
        }
    }

我有大约 300 个 ID,每隔几秒钟 - 我会启动线程来调用每个 ID。例如。

for(String id: ids) {
    MyThread thread = new MyThread(id);
    thread.start();
}

现在,我想收集每个线程的结果,并批量插入数据库,而不是每 2 秒进行 300 次数据库插入。

知道我该如何做到这一点吗?

最佳答案

规范的方法是使用 CallableExecutorServicesubmitCallable 传递给 ExecutorService 会返回一个(类型安全的)Future,您可以从中 get 结果。

class TaskAsCallable implements Callable<Result> {
    @Override
    public Result call() {
        return a new Result() // this is where the work is done.
    }
}

ExecutorService executor = Executors.newFixedThreadPool(300);
Future<Result> task = executor.submit(new TaskAsCallable());
Result result = task.get(); // this blocks until result is ready

在您的情况下,您可能希望使用返回 FuturesListinvokeAll,或者在添加任务时自己创建该列表给执行人。要收集结果,只需对每个结果调用 get

关于java - 从 Java 线程返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2314402/

相关文章:

java - 你如何让java方法注释在scala中工作

java - 只要用户处于当前 session 中,就可以防止同一操作被调用两次

java - 将事件处理添加到 Jframe 对话框

java - android中如何循环遍历json数据

c - 多线程程序在完成之前卡住

scala - 同时处理具有重复项的序列

c# - 异步接受传入请求

java - 根据输入的数量在 while 循环中创建多个 java 线程

java - int 基本类型的 volatile 声明

java - LinkedTransferQueue 应该如何使用?