一、 ExecutorService 自身方法
- void shutdown;会拒绝继续提交任务到队列,但会把正在执行的任务和队列中的任务执行完。
- boolean isShutdown;判断是否开始了关闭工作,为ture不代表线程池已经关闭,只代表可以执行关闭任务了。
- boolean isTerminated;代表线程已经真正终结了。
- boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; 等待一点时间,如果线程池终结返回true,没有终结返回false,如果线程被打断抛异常。
- List shutdownNow;立刻发送中断信号,终止所有线程,并返回一个停止线程的队列,要求线程能够正确响应中断。
- 使用 threadPoll.shutdown()和 threadPoll.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);配合
package com.example.thread.threadlocal.scene1;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadLocalDemo08 {
public static ExecutorService threadPoll = new ThreadPoolExecutor(16, 16,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1000));
public SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");
public static void main(String[] args) throws InterruptedException {
long st = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
int finalI = i;
threadPoll.execute(() -> {
String date = date(finalI);
System.out.println(date);
});
}
threadPoll.shutdown();
threadPoll.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
if (threadPoll.isTerminated()) {
long et = System.currentTimeMillis();
System.out.println("耗时:" + (et - st) + "秒");
}
}
public static String date(int seconds) {
Date date = new Date(1000 * seconds);
SimpleDateFormat simpleDateFormat = ThreadSafeFormat.dataFormatterThreadLocal.get();
System.out.println(System.identityHashCode(simpleDateFormat));
return simpleDateFormat.format(date);
}
static class ThreadSafeFormatter06 {
public static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new ThreadLocalDemo08().simpleDateFormat;
}
};
}
}
二、CountDownLatch类
- 使用CountDownLatch
package com.example.thread.threadlocal.scene1;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadLocalDemo06 {
public static ExecutorService threadPoll = new ThreadPoolExecutor(16, 16,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1000));
public SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");
public static void main(String[] args) throws InterruptedException {
long st = System.currentTimeMillis();
CountDownLatch countDownLatch = new CountDownLatch(1000);
for (int i = 0; i < 1000; i++) {
int finalI = i;
threadPoll.execute(() -> {
String date = date(finalI);
System.out.println(date);
countDownLatch.countDown();
});
}
countDownLatch.await();
long et = System.currentTimeMillis();
System.out.println("耗时:"+(et-st)+"秒");
}
public static String date(int seconds) {
Date date = new Date(1000 * seconds);
SimpleDateFormat simpleDateFormat = ThreadSafeFormat.dataFormatterThreadLocal.get();
System.out.println(System.identityHashCode(simpleDateFormat));
return simpleDateFormat.format(date);
}
static class ThreadSafeFormatter06 {
public static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new ThreadLocalDemo06().simpleDateFormat;
}
};
}
}