两个目的:
1,主线程里面加一个子线程实现主线程和子线程异步,主线程可以先返回结果给上层,子线程继续执行比较耗时的操作
2,需要等线程池里所有的子线程执行完某些操作,再去做某些操作,比如更新数据库的任务执行结果,资源可用状态
package mulityThreadTest;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ConuntDownLatchTest2 {
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(1, 10, 2L, TimeUnit.SECONDS, new LinkedBlockingDeque<>(Integer.MAX_VALUE));
ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
ConuntDownLatchTest2 terminationTest = new ConuntDownLatchTest2();
try {
String test = terminationTest.test();
System.out.println("ConuntDownLatchTest2.main test() result:" + test);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String test() throws InterruptedException {
String result = "test";
new Thread(
new Runnable() {
@Override
public void run() {
Integer taskCount = 1024;
CountDownLatch latch = new CountDownLatch(taskCount);
for (int i = 0; i < taskCount; i++) {
final Integer j = i;
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println("time:" + System.currentTimeMillis() + " currentThread:" + Thread.currentThread().getName() + " print j:" + j);
latch.countDown();
}
});
}
try {
latch.await();
System.out.println("time:" + System.currentTimeMillis() + " all subTask finished");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
).start();
System.out.println("time:" + System.currentTimeMillis() + "test() main return result");
return result;
}
}
输出结果: