线程池

        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10, new DiyThreadFactory());
        for (int i = 0; i <10 ; i++) {
            scheduledExecutorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                }
            });
        }


 自定义ThreadFactory
class DiyThreadFactory implements ThreadFactory{
     ThreadGroup group =new  ThreadGroup("CONSUMER");
      private  static String namePrefix="_ORDER_";
    private final AtomicInteger threadNumber = new AtomicInteger(1);

    @Override
    public Thread newThread(Runnable runnable) {
        Thread thread = new Thread(group, runnable,
                group.getName()+namePrefix+threadNumber.getAndIncrement());
        return thread;
    }
}
/** * newSingleThreadExecutor 
* 创建单个线程 创建固定1核心同时最大数量也是1个数线程 
大于最大线程池数量1时:将按照顺序执行,
当大于最大Integer时默认直接拒绝 
*new LinkedBlockingQueue<Runnable>() * * *

 * newFixedThreadPool 创建固定核心个数线程 
* 大于最大线程池数量时:默认直接拒绝 
*new LinkedBlockingQueue<Runnable>() * * * * 

newScheduledThreadPool 
* 创建具有调度任务的线程 可以配置核心线程数量和制定工厂 * 
大于最大线程池数量时:默认直接拒绝 
*new DelayedWorkQueue()

*  newCachedThreadPool
 * 创建的线程具有重新使用 可以指定创建线程使用的工厂
 *最小核心数为0,最大为INTEGER最大值 
* 线程存活时间为60s,60s没被使用将销毁 
* 大于最大线程池数量时:默认直接拒绝 
* new SynchronousQueue<Runnable> 异步执行
 * *
* executor.invokeAny(callables)返回线程集合其中一个执行完成的结果 
* executor.invokeAll(callables)返回线程集合所有的执行结果 *
 * executor.submit()有返回结果
 * executor.execute()没回结果
 */

 

//        创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
//        execute 执行但不会返回结果   这个方法有个问题,就是没有办法获知task的执行结果。如果我们想获得task的执行结果,我们可以传入一个Callable的实例
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //异步执行
        for (int i = 0; i <10 ; i++) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("如果帅有罪,请把我埋葬");
                }
            });

        }
        Thread.sleep(1000);
        executorService.shutdownNow();

 

//        这个方法有个问题,就是没有办法获知task的执行结果。如果我们想获得task的执行结果,我们可以传入一个Callable的实例
//        创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
//        executor.submit  执行会有返回结果, future.get()获取结果会阻塞线程
        ExecutorService executorService2 = Executors.newFixedThreadPool(2);
        //异步执行
        executorService2.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("cafa babe");
            }
        });
        Future<String> future1 = executorService2.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "蛟龙入海";
            }
        });
        Future future2 = executorService2.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("鹰击长空");
            }
        });
        Object o1 = future1.get();
        Object o2 = future2.get();
        System.out.println(o1);
        System.out.println(o2);
        executorService2.shutdown();

 

//        invokeAny 返回执行某个线程执行的结果
        ExecutorService executorSingleService = Executors.newFixedThreadPool(3);
        Set<Callable<String>> callables = new HashSet<Callable<String>>();

        callables.add(new Callable<String>() {
            public String call() throws Exception {
                return "Task 1";
            }
        });
        callables.add(new Callable<String>() {
            public String call() throws Exception {
                return "Task 2";
            }
        });
        callables.add(new Callable<String>() {
            public String call() throws Exception {
                return "Task 3";
            }
        });

        String result = executorSingleService.invokeAny(callables);
        System.out.println("result = " + result);


//        invokeAll   返回所有线程返回的结果
        Set<Callable<String>> callables0 = new HashSet<Callable<String>>();
        callables0.add(new Callable<String>() {
            public String call() throws Exception {
                return "Task 1";
            }
        });
        callables0.add(new Callable<String>() {
            public String call() throws Exception {
                return "Task 2";
            }
        });
        callables0.add(new Callable<String>() {
            public String call() throws Exception {
                return "Task 3";
            }
        });

        List<Future<String>> futures = executorSingleService.invokeAll(callables0);
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>:" + JSON.toJSONString(futures));
        executorSingleService.shutdown();

 

//      定时任务
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10, Executors.defaultThreadFactory());
//        延迟三秒执行
        scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("延迟三秒执行");
            }
        }, 3, TimeUnit.SECONDS);

//        延迟三秒后每三秒执行一次
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("延迟三秒后执行三秒");
            }
        }, 3, 3, TimeUnit.SECONDS);

//        第一次执行延迟三秒,然后每三秒执行一次
        scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println("第一次执行延迟三秒,然后每三秒执行一次");
            }
        }, 3, 3, TimeUnit.SECONDS);
        Thread.sleep(1000000);
        scheduledExecutorService.shutdown();

 

       //线程池里面的线程数会动态变化,并可在线程线被移除前重用,可以使用之前的线程
        ExecutorService threadPool = Executors.newCachedThreadPool();
        for (int i = 1; i <= 20; i++) {
            int finalI = i;
            threadPool.execute(new Runnable() {    //接受一个Runnable实例
                public void run() {
                    System.out.println("线程名字: " + Thread.currentThread().getName() + "  任务名为: " + finalI);
                }
            });
        }

        threadPool.shutdown();

 

  //核心线程,最大线程数,存活时间,时间单位,队列
            ThreadPoolExecutor threadPoolExecutor1=new ThreadPoolExecutor(1,1, 1,TimeUnit.SECONDS,new LinkedBlockingDeque<>());
            //核心线程,最大线程数,存活时间,时间单位,队列,工厂方式
            ThreadPoolExecutor threadPoolExecutor2=new ThreadPoolExecutor(1,1, 1,TimeUnit.SECONDS,new LinkedBlockingDeque<>(), Executors.defaultThreadFactory());
            //核心线程,最大线程数,存活时间,时间单位,队列,大于最大线程数策略
            ThreadPoolExecutor threadPoolExecutor3=new ThreadPoolExecutor(1,1, 1,TimeUnit.SECONDS, new LinkedBlockingDeque<>(),new ThreadPoolExecutor.AbortPolicy());
            //核心线程,最大线程数,存活时间,时间单位,队列,工厂方式,大于最大线程数策略,
            ThreadPoolExecutor threadPoolExecutor4=new ThreadPoolExecutor(1,1, 1,TimeUnit.SECONDS,new LinkedBlockingDeque<>(),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
            threadPoolExecutor4.execute();
            threadPoolExecutor4.submit();

 

 

posted @ 2022-04-02 16:59  余生请多指教ANT  阅读(22)  评论(0编辑  收藏  举报