Java多线程之Executor框架和手写简易的线程池(2)

if(task !=null){
                        //取到任务后执行
                        task.run();
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        task = null;//任务结束后手动置空,加速回收
    }

public void cancel(){
        on = false;
        interrupt();
    }
}

当然退出时还需要对线程池中的线程等进行销毁。
    //销毁线程池
    public void shutdown(){
        for(int i=0;i<threadNum;i++){
            workerThreads[i].cancel();
            workerThreads[i] = null;
        }
        queue.clear();
    }

好了,到这里我们的一个简易版的线程池就完成了,功能虽然不多但是线程池运行的基本原理差不多实现了,实际上非常简单,我们来写个程序测试一下:
public class ThreadPoolTest {
    public static void main(String[] args) throws InterruptedException {
        // 创建3个线程的线程池
        MyThreadPool t = new MyThreadPool(3);
        CountDownLatch countDownLatch = new CountDownLatch(5);
        t.execute(new MyTask(countDownLatch, "testA"));
        t.execute(new MyTask(countDownLatch, "testB"));
        t.execute(new MyTask(countDownLatch, "testC"));
        t.execute(new MyTask(countDownLatch, "testD"));
        t.execute(new MyTask(countDownLatch, "testE"));
        countDownLatch.await();
        Thread.sleep(500);
        t.shutdown();// 所有线程都执行完成才destory
        System.out.println("finished...");
    }

// 任务类
    static class MyTask implements Runnable {

private CountDownLatch countDownLatch;
        private String name;
        private Random r = new Random();

public MyTask(CountDownLatch countDownLatch, String name) {
            this.countDownLatch = countDownLatch;
            this.name = name;
        }

public String getName() {
            return name;
        }

@Override
        public void run() {// 执行任务
            try {
                countDownLatch.countDown();
                Thread.sleep(r.nextInt(1000));
                System.out.println("任务 " + name + " 完成");
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getId()+" sleep InterruptedException:"
                        +Thread.currentThread().isInterrupted());
            }
        }
    }
}

result:
任务 testA 完成
任务 testB 完成
任务 testC 完成
任务 testD 完成
任务 testE 完成
finished...
Java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
    at com.learn.threadpool.MyThreadPool$WorkerThread.run(MyThreadPool.java:75)
...

从结果可以看到我们提交的任务都被执行了,当所有任务执行完成后,我们强制销毁了所有线程,所以会抛出异常。

JDK中的线程池

上面我们实现了一个简易的线程池,稍微理解线程池的基本运作原理。现在我们来认识一些JDK中提供了线程池吧。

ThreadPoolExecutor
public class ThreadPoolExecutor extends AbstractExecutorService

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5a88e4496d8fb0a25cdc5c39ccb4ec72.html