Executor的作用
提供了一种灵活的线程池实现方式,而线程池可以简化线程的管理工作。
Executor的实现模式
Executor管理线程池的实现是基于生产者消费者模式。
生产者:通过execute方法中的workQueue.offer将Runnable任务添加到阻塞队列中。
消费者:通过execute方法中的addWorker创建Worker,Worker本身是个Runnable,同时也含有Thread变量, run方法调用了runWorker(),runWorker()又通过getTask()获取任务。
package edu.wyn.concurrent.chapter6;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class TaskExecutionWebServer {
private static final int NTHREADS = 100;
private static final Executor exe
= Executors.newFixedThreadPool(NTHREADS);
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(80);
while(true) {
Socket socket = serverSocket.accept();
Runnable task = () -> handleRequest(socket);
//将任务的提交过程和执行过程解耦
//生产者-消费者模式
/**
* 生产者:
* 通过execute方法中的workQueue.offer将Runnable任务添加到阻塞队列中(当前线程数已经超过核心线程数)
* **/
/**
* 消费者:
* 通过execute方法中的addWorker创建Worker,Worker本身是个Runnable,同时也含有Thread变量,关注run方法
* run方法调用了runWorker(),runWorker()又通过getTask()获取任务
* **/
exe.execute(task);
}
}
private static void handleRequest(Socket socket) {
try {
InputStream inputStream = socket.getInputStream();
byte[] contain = new byte[1024];
int len;
while((len = inputStream.read(contain)) != -1) {
String str = new String(contain, 0, len);
System.out.println(str);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
网友评论