美文网首页
多线程之 线程池

多线程之 线程池

作者: 测试员 | 来源:发表于2019-08-19 10:53 被阅读0次

    选择线程池的理由

    频繁的创建与销毁需要实时间

    线程池概述

    程序启动个新线程的成本是比较高的,因为涉及到要操作系统交互,当要创建大量的运行时间很短的线程时,线程池的特性就很适合:不用的线程不会杀死而是作为空闲状态放进线程池里,等待下一个对象来使用。JDK5之前需要手动实现自己的线程池,之后java支持内置线程池。

    内置线程池的使用概述

    JDK5新增了一个Executor工厂类类产生线程池,有如下两个方法。
        public static ExecutorService newFixedThredpool(int i)
        public static ExecutorService newStringThreadExecutor()
    这些方法的返回值是 ExecutorService 对象,该对象表示一个线程池,该线程池对象可以执行Runnable 和Callable 对象代表的课程,他提供了如下方法。
        Future<?> submit(Runnable task)
        <T>Future<T> submit(Callable<T> task)
    使用步骤
        创建线程池对象
        创建Runnable实例
        提交Runnable示例
        关闭线程池 pool.sutdown();
    

    使用线程池

    常用方法
        public static ExecutorService newFixedThreadPool(int nThreads) :返回线程池对象。(创建的是有界线 程池,也就是池中的线程个数可以指定最大数量)
        public Future<?> submit(Runnable task) :获取线程池中的某一个线程对象,并执行
    
    使用线程池
        import java.util.concurrent.ExecutorService;
        import java.util.concurrent.Executors;
        
        public class ThreadpoolDemo {
            public static void main(String[] args) {
                //1.创建线程池对象
                ExecutorService pool = Executors.newFixedThreadPool(3);
                //2.创建多线程任务
                MyRunnable myRunnable = new MyRunnable();
                pool.submit(myRunnable);
                pool.submit(myRunnable);
                pool.submit(myRunnable);
        
            }
        }
        
        class MyRunnable implements Runnable{
                    int i = 0;
            @Override
            public void run() {
                for(;;){
                    synchronized (this){
                        System.out.println("这是第"+ i++ +"次运行" +"-->"+ Thread.currentThread().getName());
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    

    线程池

    提供和了一个线程队列,队列中保存着所有等待状态的线程。避免了穿件与销毁的额外开销,提高了响应速度。

    线程池的体系结构

    java.util.concurrent.Executor【负责线程的调度和使用的根接口】
    |--ExecutorService【线程池主要接口】
    |----ThreadPoolExecutor【线程池实现类】
    |----ScheduledExecutorService【子接口:负责线程的调度】
    |--------ScheduledThreadPoolExecutor【继承ThreadPoolExecutor实现ScheduledExecutorService】

    创建线程池----4种不同的线程池

    /**
     * 创建缓存线程池 池中线程数量不固定,因需变化
     */
    ExecutorService cachedPool = Executors.newCachedThreadPool();
    /**
     * 创建固定(线程数)大小的线程池
     */
    ExecutorService executorService = Executors.newFixedThreadPool(1);
    /**
     * 创建单个线程的线程池(池中只有一个线程)
     */
    ExecutorService singledPool = Executors.newSingleThreadExecutor();
    /**
     * 创建固定大小的线程池,可以延迟或者定时执行任务
     */
    ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(1);
    

    线程调度----(用以上一种随便举个例子)

    class ScheduledPoolDemo {
        public static void main(String[] args) {
    
            //创建固定大小的线程池,可以延迟或者定时执行任务
            ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);
            //参数:任务,数字,数字单位 
            pool.schedule(new Task(),1, TimeUnit.SECONDS);
            pool.schedule(new Task(),1, TimeUnit.SECONDS);
            pool.schedule(new Task(),1, TimeUnit.SECONDS);
            pool.schedule(new Task(),1, TimeUnit.SECONDS);
            pool.schedule(new Task(),1, TimeUnit.SECONDS);
            //温和关闭线程
            pool.shutdown();
    
        }
    
    }
    
    class Task implements Runnable {
    
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " : " + (int) (Math.random() * 101));
        }
    }
    

    自定义线程池【日后谈啦】

    相关文章

      网友评论

          本文标题:多线程之 线程池

          本文链接:https://www.haomeiwen.com/subject/qqadsctx.html