Java并发库的设计模式---Command模式

本文深入探讨了Executor接口及其实现方式,阐述了如何利用它解耦任务执行策略与执行过程,提升程序的健壮性和可扩展性。通过对比Executor与Thread,详细介绍了ExecutorService的生命周期管理功能,并列举了其在不同场景下的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public interface Executor{
      void execute(Runnable cmd);
}

     如此简单的接口,却为一个灵活而强大的框架创造了基础。使得线程的执行逻辑和时序逻辑得到了分离,提高了健壮性和可扩张性,使得需求变化时不再是将整个程序重写而只需修改相应的执行逻辑

 

     Executor解藕了任务的执行策略和任务的执行过程:  只要提交给Executor一个Runnable,Exector根据自身的执行策略(如使用线程池,定时执行,或单线程等等),去调用runnable的run方法。Executor只是指定执行的策略,只知道Runnable有个run方法,不需要知道run what;而 Runnable只需要知道自己到底做什么,不需要知道到底按什么顺序做,什么时刻做。

      这里面有两个变化点:“做什么” 和 ”怎么做“的变化当系统有多个变化点时,我们一般的做法是对每个变化点分别进行封装 。这样使得每个对象(类)只需要管理一种变化。一个变化了,不会影响到其他的变化点,保证了可扩展性。

       Executor实际上就是一个Command模式。命令模式使用很常见,GUI的Swing中菜单命令,JDBC的Query命令对象等等(这里不说Command模式了,想写的时候在写吧)。

 

        类库中提供了几个Executor的实现(主要用于线程池),通过调用Executors的某个静态方法来创建:

       newFixedThreadPool 创建一个顶长的线程池。

       newCacheThreadPoo; 创建一个可缓存的线程池。如果当前线程池的长度超过了处理的需要,就回收空闲线程;当需求增加是,灵活增加新的线程。

       newSingleThreadExecutor 创建一个单线程的executor

       newScheduleThreadPool 创建一个定长的线程池,支持定时的以及周期性的执行(替代Timer)

 

 

Executor Vs Thread
当看到如下的代码:
new Thread(runnable).start()
并且可能最终希望获得一个更加灵活的执行策略是,考虑使用Executor代替Thread

 

   ExecutorService继承了Executor,提供了对生命周期管理。

 

public interface ExecutorService exetends Executor {
     void shutdown(();
     List<Runnable> shutdownNow();
     boolean isShutdown();
     boolean istermindated();
    boolean awaitTermination(long timeout, TimeUnit unit)
        throw InterruptedException;
    //....其他用于任务提交的便利方法
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值