java基础--29.线程池的实现方式2-结合Callable对象

创建Callable对象

注意:
Callable 是带泛型的接口
这里执行的泛型其实是 call() 方法的返回值类型

/*
 * 线程求和案例:实现 1~x 之间的累加求和
 */
public class MyCallable implements Callable {

    private Integer number = new Integer(0);

    public MyCallable(int number) {
        this.number = number;
    }

    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int x = 1; x <= number; x++) {
            sum += x;
        }
        return sum;
    }

}

实现线程池的代码--方法2
/*
 *  A:创建一个线程池对象,控制要创建几个线程对象
 *      static ExecutorService newFixedThreadPool(int nThreads) 
 *      
 *  B:这种线程池的线程可以执行:
 *      可以执行Callable对象代表的线程
 *      做一个类实现Callable接口
 *      
 *  C:调用如下方法:
 *      <T> Future<T> submit(Callable<T> task)  
 *      
 *  D:执行完之后想结束线程,可以吗?
 *      可以
 *      
 *  E:利用返回值获取执行结果
 *      
 */


public class ExecutorsDemo {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //1.创建线程池对象
        ExecutorService pool = Executors.newFixedThreadPool(2);

        //2.可以执行Runnable对象或者Callable对象代表的线程
        //利用Future对象接收返回值
        Future<Integer> f1 = pool.submit(new MyCallable(100));
        Future<Integer> f2 = pool.submit(new MyCallable(200));

        //3.通过Future对象的get()方法获取结果,并输出结果
        System.out.println(f1.get());
        System.out.println(f2.get());

        //4.运行结束后,结束线程池
        pool.shutdown();
    }

}

运行结果:

5050
20100
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以通过线程池和Future对象结合使用实现异步计算并实时反馈进度。下面是一个示例代码,其中使用了5个核心线程的线程池: ```java ExecutorService executor = Executors.newFixedThreadPool(5); List<Future<Integer>> futures = new ArrayList<>(); for (int i = 0; i < 10; i++) { final int progress = i; Future<Integer> future = executor.submit(new Callable<Integer>() { @Override public Integer call() throws Exception { int result = 0; for (int j = 0; j < 10; j++) { result += j; // 模拟计算过程中的进度反馈 System.out.println("Progress: " + progress + ", Sub-progress: " + j); Thread.sleep(1000); } return result; } }); futures.add(future); } while (true) { boolean allDone = true; int totalProgress = 0; for (int i = 0; i < futures.size(); i++) { Future<Integer> future = futures.get(i); if (!future.isDone()) { allDone = false; } else { totalProgress += future.get(); futures.remove(i); i--; } } // 模拟实时获取计算进度 System.out.println("Current progress: " + totalProgress); if (allDone) { break; } Thread.sleep(500); } executor.shutdown(); ``` 在这个示例中,我们首先创建了一个有5个核心线程的线程池,然后提交了10个Callable对象线程池中执行。在Callable对象中,我们模拟了一个计算过程,通过循环来计算结果,并在每次循环中模拟了一个进度反馈过程。在主线程中,我们通过一个while循环来实时获取计算进度,并判断计算是否完成。在每次循环中,我们遍历所有的Future对象,如果有某个Future对象还没有完成计算,那么就将allDone标记为false;否则,就将计算结果累加到totalProgress中,并从futures列表中移除该Future对象。最后,我们通过一个自定义的getCurrentProgress()方法来获取计算进度,并在控制台中输出。当所有的计算都完成后,我们跳出循环,并调用线程池的shutdown()方法来关闭线程池
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值