该系列文章是博主学习笔记,禁止转载,读书交流群:946541246
文章目录
Java并发编程实战六章学习
线程池
线程池分类(其实Java线程池就是比Android线程池前面多个new)
newFixedThreadPool
创建一个固定长度的线程池,每当提交一个任务时就创建一个线程,直到达到线程池的最大数量,这时线程池的规模将不再变化(如果某个线程由于发生了未预期的Exception而结束,那么线程池会补充一个新的线程)
newCachedThreadPool
将创建一个可缓存的线程池,如果线程池的当前规模超过了处理需求时,那么将回收空闲的线程,而当需求增加时,则可以添加新的线程,线程池的规模不存在任何限制。
newScheduledThreadPool
创建一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer
newSingleThreadPool
创建单个工作者线程来执行任务,如果这个线程异常结束,会创建另一个线程来代替
线程池生命周期
Executor扩展了ExecutorService 接口,扩展了生命中后期方法
public interface ExecutorService extends Executor
void shutdown();
List<Runnable> shutdownNow();
isShutdown();
isTerminated();
awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException
ExecutorService的生命周期有三种状态:运行、关闭和已终止。
shutdown方法将执行平缓的关闭过程:不再接受新的任务,同时等待已经提交的任务执行完成——包括哪些还未开始执行的任务
shutdownNow方法将执行粗暴的关闭过程:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务
public class LifecycleWebServer {
private final ExecutorService exec = Executors.newCachedThreadPool();
public void start() throws IOException {
ServerSocket socket = new ServerSocket(80);
while (!exec.isShutdown()) {
try {
final Socket conn = socket.accept();
exec.execute(new Runnable() {
public void run() {
handleRequest(conn);
}
});
} catch (RejectedExecutionException e) {
if (!exec.isShutdown())
log("task submission rejected", e);
}
}
}
public void stop() {
exec.shutdown();
}
private void log(String msg, Exception e) {
Logger.getAnonymousLogger().log(Level.WARNING, msg, e);
}
void handleRequest(Socket connection) {
Request req = readRequest(connection);
if (isShutdownRequest(req))
stop();
else
dispatchRequest(req);
}
interface Request {
}
private Request readRequest(Socket s) {
return null;
}
private void dispatchRequest(Request r) {
}
private boolean isShutdownRequest(Request r) {
return false;
}
}