線程池多線程處理多任務,適用按順序輸出結果


package com.test;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.*;

public class ThreadPoolExecutorTest2 {
    public static void main(String[] args)  throws InterruptedException, ExecutionException{
        ThreadPoolExecutorTest2 threadPoolExecutorTest2 = new ThreadPoolExecutorTest2();
        threadPoolExecutorTest2.doThing();
    }

    public void doThing() throws InterruptedException, ExecutionException {
        /**
         * 創建線程池,並發量最大為5
         * LinkedBlockingDeque,表示執行任務或者放入隊列
         */
        ThreadPoolExecutor tpe = new ThreadPoolExecutor(5, 10, 0,
                TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(),
                new ThreadPoolExecutor.CallerRunsPolicy());

        //存儲線程的返回值
        List<Future<String>> results = new LinkedList<Future<String>>();

        for (int i = 0; i < 10; i++) {
            Task task = new Task(i);
            System.out.println("放入線程池:" + i);
            //調用submit可以獲得線程的返回值
            Future<String> result = tpe.submit(task);
            results.add(result);

        }

        //此函數表示不再接收新任務,
        //如果不調用,awaitTermination將一直阻塞
        tpe.shutdown();
        //1小時,模擬等待
        System.out.println(tpe.awaitTermination(1, TimeUnit.HOURS));

        //輸出結果
        for (int i = 0; i < 10; i++) {
            System.out.println(results.get(i).get());
        }
    }


    private class Task implements Callable {
        private int val;

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

        @Override
        public String call() throws Exception {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("完成 "+ val);
            return "返回值" + val;
        }
    }
}
 

運行結果:


放入線程池:0
放入線程池:1
放入線程池:2
放入線程池:3
放入線程池:4
放入線程池:5
放入線程池:6
放入線程池:7
放入線程池:8
放入線程池:9
完成 0
完成 1
完成 3
完成 2
完成 4
完成 5
完成 6
完成 9
完成 7
完成 8
true
返回值0
返回值1
返回值2
返回值3
返回值4
返回值5
返回值6
返回值7
返回值8
返回值9

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM