不带返回值
public class MyThreadPool {
private static final int DEFAULT_THREAD_NUM = 10;
private int maxThreadNum;
private BlockingQueue<Runnable> queue;
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;
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();
}
}
void execute(Runnable runnable) {
try {
queue.put(new FutureTask(runnable, null));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
<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();
}
}
}