多線程閉鎖

  • 寫一個多線程閉鎖的標準demo
/**
     * 自測多線程閉鎖
     * @param args
     */
    public static void main(String[] args) {

        ArrayList<String> demoList = Lists.newArrayList();
        demoList.add("111");
        demoList.add("222");
        demoList.add("333");

        List<List<String>> lists = Lists.partition(demoList, 1);

        //創建線程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(poolSize, poolSize, 2, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1024), ThreadPoolUtil.THREAD_FACTORY, new ThreadPoolExecutor.AbortPolicy());

        //創建計數器、FutureTask接受每個線程的處理結果
        CountDownLatch latch = new CountDownLatch(lists.size());
        List<FutureTask<Boolean>> taskList = new ArrayList<>();

        //循環開啓線程
        for (List<String> list : lists) {
            FutureTask<Boolean> task = new FutureTask<>(new Callable<Boolean>() {
                @Override
                public Boolean call() {
                    Boolean result = false;
                    try {
                        System.out.println(list + Thread.currentThread().getName());
                        result = true;
                    } finally {
                        latch.countDown();
                    }
                    return result;
                }
            });
            //每次開啓一個線程都加入線程池
            executor.submit(task);
            //每個線程的處理結果放入集合
            taskList.add(task);
        }

        //線程等待
        try {
            //latch.await();//不設置時間就一隻等待知道所有線程都執行完成
            boolean allFinished = latch.await(10, TimeUnit.SECONDS);
            if (!allFinished) {
                log.error("多線程閉鎖等待了10s,仍未執行完畢");
            }
        } catch (InterruptedException e) {
            log.error("線程中斷!", e);
            //通過調用thread.currentThread().interrupt(),可以設置線程的中斷標誌,這樣更高級別的中斷處理程序就會注意到它,並可以適當地處理它。
            Thread.currentThread().interrupt();
        }

        //解析每個線程的執行結果
        for (FutureTask<Boolean> task : taskList) {
            Boolean result = false;
            try {
                result = task.get();
                System.out.println(result + "-" + task);
            } catch (Exception e) {
                log.error("線程中斷!", e);
                //通過調用thread.currentThread().interrupt(),可以設置線程的中斷標誌,這樣更高級別的中斷處理程序就會注意到它,並可以適當地處理它。
                Thread.currentThread().interrupt();
            }
            if(!result){
                System.out.println("多線程閉鎖存在某線程處理異常!");
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章