concurrent-3-线程复用

来源:互联网 发布:hbase mysql元数据 编辑:程序博客网 时间:2024/05/02 03:10

Executor框架

线程池

    newFixedThreadPool()    //线程池中的线程数量始终不变,新任务提交,有空闲线程立马执行,否则会将任务加入到任务队列,有线程空闲时,便处理在任务队列中的任务。    newSingleThreadExecutor()    //线程池中的线程数量为1,新任务提交,线程空闲则立马执行,否则会将任务加入到任务队列,待线程空闲时,便处理在任务队列中的任务。    newCachedTheadPool()    //可根据实际情况调整线程池数量,优先使用空闲线程,待无空闲线程,又有新任务时,创建新的线程执行。
 public static void main(String[] args) {        ExecutorService executorService=Executors.newFixedThreadPool(5);        for(int i = 0 ; i < 10 ; i ++) {            executorService.submit(                    ()->{                    System.out.println(Thread.currentThread().getId());                        try {                            Thread.sleep(2000);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }            );        }        executorService.shutdown();    }    //输出    //11    //12    //13    //14    //15    //13    //14    //15    //11    //12

计划任务

        newSingleThreadScheduledExecutor()        //线程池中的线程数量始终未1,在指定时间执行某任务        newScheduledThreadPool()        //线程池可以指定线程数量
 //scheduleAtFixedRate //每隔一定频率执行 //scheduleWithFixedDelay //每隔一个执行时间间隔后执行 public static void main(String[] args) {        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);        scheduledExecutorService.scheduleAtFixedRate(        //scheduledExecutorService.scheduleWithFixedDelay(                ()->{                    try {                        Thread.sleep(4000);                        System.out.println(System.currentTimeMillis()/1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }        ,0,2, TimeUnit.SECONDS);    }    //输出1    //1495982410    //1495982414    //1495982418    //1495982422    //输出2    //1495982354    //1495982360    //1495982366    //1495982372