多线程处理返回值

本文探讨了软件开发中技术分享的重要性,并深入讲解了线程的实现方式,特别是使用Callable接口来获取线程执行后的结果,通过实例展示了如何利用线程池执行多个线程任务并收集结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没写博客,看了下上一篇发表的时间发现已是一年多前,看到消息处的小红点,点了下发现仍然有很多新朋友关注了我,给我留言,给我的博文点赞,让我发现技术分享的重要性,不仅仅是影响一个人,而是影响一群人。软件开发是一份很潮的工作,会随着历史的潮头不断奔流不息,只有屹立潮头的人才不会被淘汰。逆水行舟,不进则退,多少比你差的人比你还几倍的努力。如果你总是止步不前,拒绝新的技术,你还期望公司给你加薪,你还指望同事教你该怎么写代码还拿着比同事高的工资,即使你现在还能苟延残喘,但终究会被抛弃。

说了很多废话,只是希望自己警醒,希望认同上述观点的人同样能感受到那些每天看凌晨三点太阳的人的压力,其他不认同的人大概可以跳过直接看下面的内容。本文要写的内容是关于线程,工作中有些写业务代码的开发这块用得比较少,但是面试时面试官总喜欢问多线程相关问题,例如下面这些:

1)什么是线程

2)怎么样实现多线程

3)有没有用过线程池

4)怎么样实现一个线程池

5)不要线程池可不可以

……

这些问题大家可以思考下,本文不对上述问题进行解答。大家都知道new一个线程或者实现Ruannable接口,调度这些线程是没有返回值的,如果我们需要线程任务处理完毕会返回一个成功与否的标志,那么可以采用下面的方式

public class Task implements Callable<String> {
    private int id;

    public Task(int id) {
        this.id = id;
    }

    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    @Override
    public String call() throws Exception {
        return "线程号:" + Thread.currentThread().getId();
    }
}

线程类没有实现Runnable接口,而是实现Callable接口的call方法。

public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        ArrayList<Future<String>> list = new ArrayList<Future<String>>();
        for (int i =0;i<10;i++){
            list.add(executorService.submit(new Task(i)));
        }

        for(Future<String> future : list){
            System.out.println(future.get());
        }
    }
}

创建了一个缓存线程池(线程池的线程数会动态伸缩),将线程任务放到线程池中执行,结果被保存到Future泛型的List中。最后打印出所有线程任务的结果。

大家可以思考下线程池执行任务返回结果是同步还是异步的,这种同步或者异步的效果又是通过什么方式实现的,我们拿到的结果是否真实。

在 Java 中,如果你想要在循环中并行地执行多个任务并获取每个任务的结果,可以结合 `Thread` 类或者 `ExecutorService` 来实现多线程。下面是一个简单的示例,展示了如何在循环中启动新线程,并使用 Future 接收返回值: ```java import java.util.concurrent.*; public class MultiThreadExample { public static void main(String[] args) { // 创建固定大小的线程池 ExecutorService executor = Executors.newFixedThreadPool(5); int tasksCount = 10; // 循环次数 for (int i = 0; i < tasksCount; i++) { final int taskIndex = i; // 提交一个新的 Runnable 实现到线程池 Future<Integer> future = executor.submit(new Callable<Integer>() { @Override public Integer call() throws Exception { // 这里是你要执行的任务,例如计算 return calculate(taskIndex); } }); // 在主线程中处理future的结果,当异步任务完成时 try { int result = future.get(); // 等待结果 System.out.println("Task " + taskIndex + " returned: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } // 关闭线程池 executor.shutdown(); } private static int calculate(int index) { // 这里是你实际的计算逻辑 return index * index; } } ``` 在这个例子中,`Callable` 被用于定义需要返回值的任务,而 `Future` 则允许我们在主线程中等待并获取这些任务的结果。注意,为了优雅地处理异常,通常会在 `get()` 方法中捕获可能抛出的 `InterruptedException` 或 `ExecutionException`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值