packagecom.example.demo.thread;importjava.util.concurrent.ThreadFactory;importjava.util.concurrent.atomic.AtomicInteger;publicclassCustomThreadFactoryimplementsThreadFactory{privatestaticfinalAtomicInteger POOL_NUMBER =newAtomicInteger(1);privatefinalThreadGroup group;privatefinalAtomicInteger threadNumber =newAtomicInteger(1);privatefinalString namePrefix;publicCustomThreadFactory(){SecurityManager s =System.getSecurityManager();
group =(s !=null)? s.getThreadGroup():Thread.currentThread().getThreadGroup();
namePrefix ="pool-"+ POOL_NUMBER.getAndIncrement()+"-thread-";}publicCustomThreadFactory(String poolPrefix){if(poolPrefix ==null){
poolPrefix ="pool-";}SecurityManager s =System.getSecurityManager();
group =(s !=null)? s.getThreadGroup():Thread.currentThread().getThreadGroup();
namePrefix = poolPrefix + POOL_NUMBER.getAndIncrement()+"-thread-";}@OverridepublicThreadnewThread(Runnable r){Thread t =newThread(group, r, namePrefix + threadNumber.getAndIncrement(),0);if(t.isDaemon()){
t.setDaemon(false);}if(t.getPriority()!=Thread.NORM_PRIORITY){
t.setPriority(Thread.NORM_PRIORITY);}return t;}}
自定义拒绝策略 CustomRejectedThreadHandler
packagecom.example.demo.thread;importjava.util.concurrent.RejectedExecutionException;importjava.util.concurrent.RejectedExecutionHandler;importjava.util.concurrent.ThreadPoolExecutor;publicclassCustomRejectedThreadHandlerimplementsRejectedExecutionHandler{publicCustomRejectedThreadHandler(){}@OverridepublicvoidrejectedExecution(Runnable r,ThreadPoolExecutor e){thrownewRejectedExecutionException("Task "+ r.toString()+" rejected from "+ e.toString());}}
举个例子
1.简单线程池的使用
packagecom.example.demo.thread;importlombok.Data;importlombok.extern.slf4j.Slf4j;importjava.util.concurrent.Callable;importjava.util.concurrent.ThreadPoolExecutor;@Slf4jpublicclassTestOneThread{privatestaticfinalThreadPoolExecutor THERAD_ONE =CustomThreadManager.newThreadPool(newCustomThreadFactory("threadName"));publicstaticvoidmain(String[] args){for(int i =0; i <100; i++){int finalI = i;
THERAD_ONE.submit(()->{
log.info(String.valueOf(finalI));});}System.out.println("执行完毕");}}
2.等待子线程执行完毕在执行主线程逻辑
packagecom.example.demo.thread;importlombok.extern.slf4j.Slf4j;importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.ThreadPoolExecutor;@Slf4jpublicclassTestTwoThread{privatestaticfinalThreadPoolExecutor THERAD_TWO =CustomThreadManager.newThreadPool(newCustomThreadFactory("threadName"));publicstaticvoidmain(String[] args){finalCountDownLatch countDownLatch =newCountDownLatch(100);for(int i =0; i <100; i++){int finalI = i;
THERAD_TWO.submit(()->{try{
log.info(String.valueOf(finalI));}catch(Exception e){}finally{
countDownLatch.countDown();}});}try{
countDownLatch.await();}catch(InterruptedException e){
e.printStackTrace();}System.out.println("子线程执行完毕,继续执行主线程!");}}
3.带返回值的多线程
packagecom.example.demo.thread;importlombok.Data;importlombok.Getter;importlombok.Setter;importlombok.extern.slf4j.Slf4j;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.*;@Slf4jpublicclassTestThreeThread{privatestaticfinalThreadPoolExecutor THREE_THREAD =CustomThreadManager.newThreadPool(newCustomThreadFactory("threadName"));publicstaticvoidmain(String[] args){List<Future<Book>> futureResults =newArrayList<>();for(int e =0; e <100; e++){
futureResults.add(THREE_THREAD.submit(newBuildUnitNumberThread(e, e +1)));}
futureResults.forEach(future ->{try{Book book = future.get();System.out.println("测试带返回值数据"+ book.getSum());}catch(InterruptedException e){
e.printStackTrace();}catch(ExecutionException e){
e.printStackTrace();}});}@Getter@SetterpublicstaticclassBook{privateInteger sum;publicBook(Integer sum){this.sum = sum;}}@DatastaticclassBuildUnitNumberThreadimplementsCallable<Book>{privateInteger A1;privateInteger A2;publicBuildUnitNumberThread(Integer a1,Integer a2){
A1 = a1;
A2 = a2;}@OverridepublicBookcall(){returnnewBook(A1 + A2);}}}