/**
* 自測多線程閉鎖
* @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("多線程閉鎖存在某線程處理異常!");
}
}
}