线程池和工厂模式

目录

🌳为什么使用线程池

🍅总结:

🌳标准库提供的线程池

🍅Executors

🍃 工厂模式

🍅ThreadPoolExecutor

🍃 拒绝策略


为什么使用线程池

       直接来说,使用线程池来进行多线程操作比自己手动创建线程执行更加方便,效率更高,占用资源更少

       那么为什么会有这些优点:线程虽然是轻量级的,但是手动频繁创建销毁线程也是非常耗时耗力的,使用线程池是纯用户态,而创建线程是内核态

内核:一个操作系统最核心的功能,有模块集合,内存管理,文件管理,进程管理,各种驱动等一系列功能。

       操作系统包含内核和其配套的应用层程序。操作系统运行在硬件上,而内核呢则需要给上层的应用程序提供服务。 所以手动频繁的创建销毁线程会占用较多的系统资源,而使用线程池则是用户态操作,会循环使用线程池内部创建好的线程避免频繁的创建和销毁,也就提高了效率。

总结:

标准库提供的线程池

Executors

 Executor是一个工厂类,内部提供了一些静态方法来方便选择创建不同功能的线程池。

主要有这几种功能:

 

public class Demo {
    public static void main(String[] args) {
        //根据实时情况创建线程
        ExecutorService executorService = Executors.newCachedThreadPool();
        //指定创建的线程池中有10个线程
        ExecutorService executorService1 = Executors.newFixedThreadPool(10);
        //单线程池,只用一个线程来执行任务
        ExecutorService executorService2 = Executors.newSingleThreadExecutor();

        executorService.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("newCachedThreadPool");
            }
        });

        executorService1.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("newFixedThreadPool");
            }
        });

        executorService2.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("newSingleThreadExecutor");
            }
        });
    }
}

 

 工厂模式

     工厂模式其实是来填构造方法的坑,并不是说工厂模式有多少优点,而是我们通过构造方法来实现不同对象的时候不能达到我们的目的所采取的无奈之举。

例如:我们构造一个坐标,我们知道平面中坐标的表示可以通过普通的坐标系(x,y)来表示,也可以通过极坐标来表示(r,a)。现在我们要分别实例化出这两中表达的坐标对象

        可以看到,我们想通过重载构造方法来实现在实例化对象时候创建出我们想要的坐标对象,但是我们知道这样两个构造方法并不能构成重载方法的条件(方法重载的条件可以参考这篇博客:http://t.csdn.cn/mITgE),也就不能通过这样的方式来实现。所以引出了工厂模式,通过一个工厂类,在内部显现对应的静态方法帮助我们实例化对象,来解决构造方法的缺陷。

通过PointBuild这个工厂类我们就可以实现两种坐标对象的实例化了。 

Executor也是同理,在类内部通过调用不同的静态方法来选择创建不同的线程池。

ThreadPoolExecutor

 这个是ThreadPoolExecutor的构造方法参数。

public class ThreadPoolExecutor_demo {
    public static void main(String[] args) {
        //创建线程池
        ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 4, 1, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(), new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                System.out.println("自定义的一个拒绝策略");
            }
        });
        
        //添加任务
        pool.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("当前时间: "+new Date()+"执行的线程: "+Thread.currentThread().getName());
            }
        });
    }
}

 

 拒绝策略

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值