2020-09-15 算法 手撕线程池 线程池是一个很重要的知识点,有时候面试官还会让手撕,所以这里就写了一个简单的线程池 参考:https://blog.csdn.net/hongtaolong/article/details/87808009 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677package com.CSDN;import java.util.HashSet;import java.util.Set;import java.util.concurrent.ArrayBlockingQueue;public class MyThreadPoool { private static final int WORK_NUM=100; private static final int THREAD_NUM=5; private int worknum; private int threadnum; private final Set<WorkThread> threadset; private final ArrayBlockingQueue<Runnable> workqueue; public MyThreadPoool(){ this(WORK_NUM,THREAD_NUM); } public MyThreadPoool(int worknum,int threadnum){ this.worknum=worknum; this.threadnum=threadnum; threadset=new HashSet<>(); workqueue=new ArrayBlockingQueue<Runnable>(worknum); for (int i = 0; i < threadnum; i++) { WorkThread w=new WorkThread("thead"+i); w.start(); workqueue.add(w); } } public void excute(Runnable r){ try{ workqueue.add(r); }catch (Exception e){ e.printStackTrace(); } } public void shutdown(){ System.out.println("the ThreadPool is ready to shutdown"); if(threadset==null||threadset.isEmpty()){ return; } for(WorkThread w:threadset){ w.stopthread(); w=null; } threadset.clear(); } public class WorkThread extends Thread{ public WorkThread(String name){ setName(name); } public void run(){ while(!interrupted()){ try{ Runnable runnable=workqueue.take(); if(runnable!=null){ System.out.println(getName()+"ready execute:"+runnable.toString()); runnable.run(); } runnable=null; }catch (Exception e){ interrupt(); e.printStackTrace(); } } } public void stopthread(){ interrupt(); } }} Newer 动态规划-数组 Older 看看ThreadLocal是什么,ThreadLocalRandom呢?