Java 线程池并发编程详解

来源:互联网 发布:org.apache.http包 编辑:程序博客网 时间:2024/06/03 23:43

本博文分为6个部分:
1.BizProcessor:具体的事务处理逻辑,被多线程调用。
2.BizAsyncTaskCall:实现Callable接口,用于组装FutureTask。
3.BizFutureTask:代表一个异步计算任务,用于提交任务异步执行,并返回计算结果。
4.BizExecutor:包含一个ExecutorService,用于执行异步计算任务。
5.完整的测试程序。
6.测试程序运行结果。

一、BizProcessor

public class BizProcessor {    public String bizProcess(String name){        return "Success, Congratulation to " + name;    }}

二、BizAsyncTaskCall

public class BizAsyncTaskCall<V> implements Callable<String> {    private BizProcessor bp;    private String name;    public BizAsyncTaskCall(BizProcessor bp, String name) {        this.bp = bp;        this.name = name;    }    @Override    public String call() throws Exception {        return bp.bizProcess(name);    }}

三、BizFutureTask

public class BizFutureTask extends FutureTask<String> {    private final CountDownLatch signal;    public BizFutureTask(CountDownLatch signal, BizAsyncTaskCall<String> asyncTask){        super(asyncTask);        this.signal = signal;    }    @Override    protected void done(){        signal.countDown();    }}

四、BizExecutor

public class BizExecutor {    private static final ThreadFactory THREAD_FACTORY = new ThreadFactory() {        @Override        public Thread newThread(Runnable r) {            Thread t = new Thread(r);            t.setDaemon(true);            t.setName("[bizProcessor] " + t.getName());            return t;        }    };    private final ExecutorService executor;    public BizExecutor(int minThreadNum, int maxThreadNum, int queueLength) {        executor = new ThreadPoolExecutor(                minThreadNum,                maxThreadNum,                60, TimeUnit.SECONDS,                new ArrayBlockingQueue<Runnable>(queueLength),                THREAD_FACTORY);    }    public void executeSafely(final FutureTask<String> task) {        executor.execute(task);    }    public void shutdown() {        List<Runnable> tasks = executor.shutdownNow();        if (!tasks.isEmpty()) {            System.out.println("BizProcessor shuts down, leaving " + tasks.size() + " not executed");        }    }}

五、BizMain

public class BizMain {    public static void main(String[] args) {        try{            //创建Executor            BizExecutor bizExecutor = new BizExecutor(3, 5, 10);            //创建signal,用于在任务完成后再获取结果            CountDownLatch signal = new CountDownLatch(4);            //创建task并执行            List<BizFutureTask> bizFutureTaskList = new ArrayList<BizFutureTask>();            for(int i = 0; i < 4; i++){                BizFutureTask bizFutureTask = new BizFutureTask(signal, new BizAsyncTaskCall(new BizProcessor(), "ZQ-" + i));                bizFutureTaskList.add(bizFutureTask);                bizExecutor.executeSafely(bizFutureTask);            }            //获取task执行结果            signal.await(1000, TimeUnit.MICROSECONDS);            for(int i = 0; i < 4; i++){                System.out.println(bizFutureTaskList.get(i).get());            }        }catch(Exception e){            e.printStackTrace();        }    }}

六、测试结果

Success, Congratulation to ZQ-0Success, Congratulation to ZQ-1Success, Congratulation to ZQ-2Success, Congratulation to ZQ-3
0 0