欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK中ExecutorService,Callable,Future对线程的支持

程序员文章站 2022-03-01 23:13:45
...

1、代码背景:

    假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?

2、代码:

    统计“盘子”大小的代码,此处实现jdk中的Callable接口,

package com.wang.test.concurrent;

import java.util.concurrent.Callable;

public class Task1 implements Callable<Integer> {

	private int x;
	private int y;
	
	public Task1(int x, int y) {
		this.x = x;
		this.y = y;
	}

	@Override
	public Integer call() throws Exception {
		return x*y;
	}

}

    统计汇总的代码,也是实现jdk中的Callable接口,

package com.wang.test.concurrent;

import java.util.concurrent.Callable;

public class Task2 implements Callable<Integer> {

	private int x;
	private int y;
	private int q;
	private int w;
	
	public Task2(int x, int y, int q, int w) {
		this.x = x;
		this.y = y;
		this.q = q;
		this.w = w;
	}

	@Override
	public Integer call() throws Exception {
		return x + y + q + w;
	}

}

      客户端:使用JDK中Executors.newFixedThreadPool方法创建ExecutorService,ExecutorService的submit方法接收Callable接口的实现,JDK内部将弄成线程处理,使用Future接收submit方法的返回值,当future调用get方法时,如果线程还没有执行完,程序阻塞在这里,知道线程执行完。

package com.wang.test.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Client {

	public static void main(String[] args) throws Exception {
		ExecutorService pool = Executors.newFixedThreadPool(4);

		Task1 t1 = new Task1(1,2);
		Task1 t2 = new Task1(23,34);
		Task1 t3 = new Task1(23,456);
		Task1 t4 = new Task1(3,33);
		Future<Integer> f1 = pool.submit(t1);
		Future<Integer> f2 = pool.submit(t2);
		Future<Integer> f3 = pool.submit(t3);
		Future<Integer> f4 = pool.submit(t4);
		
		//Future调用get方法时,如果线程还没有执行完,程序阻塞在这里
		Task2 t5 = new Task2(f1.get(), f2.get(), f3.get(), f4.get());
		Future<Integer> f5 = pool.submit(t5);
		
		System.out.println(f5.get());
		
		pool.shutdown();
	}
}