1. 程式人生 > 其它 >執行緒池處理Callable任務

執行緒池處理Callable任務

執行緒池如何處理Callable任務

執行緒池如何處理Callable任務,並得到任務執行完後返回的結果。
使用ExecutorService的方法:
Future<T> submit(Callable<T> command)

package com.itheima.d8_threadpool;

import java.util.concurrent.Callable;

/**
    1、定義一個任務類 實現Callable介面  應該申明執行緒任務執行完畢後的結果的資料型別
 */
public class MyCallable implements Callable<String>{
    private int n;
    public MyCallable(int n) {
        this.n = n;
    }

    /**
       2、重寫call方法(任務方法)
     */
    @Override
    public String call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= n ; i++) {
            sum += i;
        }
        return Thread.currentThread().getName()
                + "執行 1-" + n+ "的和,結果是:" + sum;
    }
}
package com.itheima.d8_threadpool;

import java.util.concurrent.*;

/**
    目標:自定義一個執行緒池物件,並測試其特性。
 */
public class ThreadPoolDemo2 {
    public static void main(String[] args) throws Exception {
        // 1、建立執行緒池物件
        /**
         public ThreadPoolExecutor(int corePoolSize,
                                 int maximumPoolSize,
                                 long keepAliveTime,
                                 TimeUnit unit,
                                 BlockingQueue<Runnable> workQueue,
                                 ThreadFactory threadFactory,
                                 RejectedExecutionHandler handler)
         */
        ExecutorService pool = new ThreadPoolExecutor(3, 5 ,
                6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5) , Executors.defaultThreadFactory(),
               new ThreadPoolExecutor.AbortPolicy() );

        // 2、給任務執行緒池處理。
        Future<String> f1 = pool.submit(new MyCallable(100));
        Future<String> f2 = pool.submit(new MyCallable(200));
        Future<String> f3 = pool.submit(new MyCallable(300));
        Future<String> f4 = pool.submit(new MyCallable(400));
        Future<String> f5 = pool.submit(new MyCallable(500));

//        String rs = f1.get();
//        System.out.println(rs);

        System.out.println(f1.get());
        System.out.println(f2.get());
        System.out.println(f3.get());
        System.out.println(f4.get());
        System.out.println(f5.get());
    }
}