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

多线程之 线程池

作者: 测试员 | 来源:发表于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