文章目录
不带返回值
public class MyThreadPool {
private static final int DEFAULT_THREAD_NUM = 10;
private int maxThreadNum;
private BlockingQueue<Runnable> queue;
// 初始化worker的时候直接调用start方法
// 在run中不断从阻塞队列中获取对象
// 由于已经调用了start方法,是一个新的线程
// 因此直接调用runnable的run方法就是使用当前线程运行任务
private class Worker extends Thread {
@Override
public void run() {
try {
for (; ; ) {
Runnable runnable = queue.take();
System.out.println(currentThread().getId());
runnable.run();
sleep(3000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private Worker[] workers;
public MyThreadPool() {
maxThreadNum = DEFAULT_THREAD_NUM;
queue = new LinkedBlockingQueue<>();
initWorkers();
}
public MyThreadPool(int maxThreadNum, BlockingQueue<Runnable> queue) {
this.maxThreadNum = maxThreadNum;
this.queue = queue;
initWorkers();
}
void initWorkers() {
workers = new Worker[maxThreadNum];
for (int i = 0; i < maxThreadNum; i++) {
workers[i] = new Worker();
workers[i].start();
}
}
void execute(Runnable runnable) {
try {
queue.put(runnable);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyThreadPool myThreadPool = new MyThreadPool(3, new LinkedBlockingQueue<>(5));
Runnable runnable = () -> {};
myThreadPool.execute(runnable);
myThreadPool.execute(runnable);
myThreadPool.execute(runnable);
myThreadPool.execute(runnable);
myThreadPool.execute(runnable);
myThreadPool.execute(runnable);
myThreadPool.execute(runnable);
myThreadPool.execute(runnable);
myThreadPool.execute(runnable);
}
}
带返回值
public class MyThreadPool2 {
private static final int DEFAULT_THREAD_NUM = 10;
private int maxThreadNum;
private BlockingQueue<FutureTask> queue;
// 原理同上
// 采用FutureTask对象的run方法运行
private class Worker extends Thread {
@Override
public void run() {
try {
for (; ; ) {
FutureTask futureTask = queue.take();
System.out.println(currentThread().getId());
sleep(3000);
futureTask.run();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private Worker[] workers;
public MyThreadPool2() {
this.maxThreadNum = DEFAULT_THREAD_NUM;
this.queue = new LinkedBlockingQueue<>();
initWorkers();
}
public MyThreadPool2(int maxThreadNum, BlockingQueue<FutureTask> queue) {
this.maxThreadNum = maxThreadNum;
this.queue = queue;
initWorkers();
}
void initWorkers() {
workers = new Worker[maxThreadNum];
for (int i = 0; i < maxThreadNum; i++) {
workers[i] = new Worker();
workers[i].start();
}
}
// 将runnable封装为FutureTask对象,null表示返回值result
void execute(Runnable runnable) {
try {
queue.put(new FutureTask(runnable, null));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 将Callable对象封装为FutureTask对象
<E> FutureTask<E> submit(Callable<E> callable) {
FutureTask<E> futureTask = new FutureTask(callable);
try {
queue.put(futureTask);
} catch (InterruptedException e) {
e.printStackTrace();
}
return futureTask;
}
public static void main(String[] args) {
MyThreadPool2 myThreadPool2 = new MyThreadPool2(3, new LinkedBlockingQueue<>(5));
Runnable runnable = () -> {
};
myThreadPool2.execute(runnable);
myThreadPool2.execute(runnable);
myThreadPool2.execute(runnable);
myThreadPool2.execute(runnable);
myThreadPool2.execute(runnable);
myThreadPool2.execute(runnable);
Callable<Integer> callable = new Callable() {
int n = 10;
@Override
public Integer call() throws Exception {
return n--;
}
};
FutureTask<Integer> futureTask1 = myThreadPool2.submit(callable);
FutureTask<Integer> futureTask2 = myThreadPool2.submit(callable);
FutureTask<Integer> futureTask3 = myThreadPool2.submit(callable);
try {
System.out.println(futureTask1.get());
System.out.println(futureTask2.get());
System.out.println(futureTask3.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}