Day23:交给专业的来

我们来看看Executor介面的内容:

package java.util.concurrent;
public interface Executor(){
    void execute(Runnable command);
}

一开始看到这个Executor的时候真的超困惑的,为什麽要用这个介面?我定义好的Runnable就丢进Thread来start()就好了啊~何必再搞一个Executor把Runnable丢进去勒?

这就是一个很好的思考点,假若我们不用这个Executor,如果我们想开10个执行绪来跑相同的Runnable,那我们大概会弄个for回圈来做:

for(int i = 0; i < 10; i++){
    new Thread(someTask).start();
}

抑或是想弄个执行绪池的概念(相当於资料库的连线池),我只要使用10个Thread实例来跑可能100个任务,不要每个任务都开新的Thread来跑。这在没有Executor出现以前,我们必须手动写出这样的程序,光想像应该也知道不是这麽好写吧?肯定会有很多流程控制要搞。

而在Executor介面出现以後,它把Runnable任务和Thread实例的指派与操作之间隔了一层execute()的抽象方法出来,在这个execute方法中我们就可以定义Runnable任务和Thread实例的关系了!而官方Java API就提供了很多现成、覆写(override)好execute()方法的类别让我们直接使用!比如上一段提到的执行绪池,我们只要如下撰写:

public class Something(){
    void doSomething(Executor executor){
        executor.execute(() -> {
            do some thing
        });
    }
}
public static void main(String[] args){
    Executor executorService = Executors.newFixedThreadPool(10);
    Something some = new Something();
    some.doSomething(executorService);
}

在我们真正要做任务的Something类别中我们用Executor的execute方法来定义要做的Runnable任务,而在Main方法要执行时,创建出我们需要的Execute服务(官方API提供了各种Execute服务,不是只有上面范例这个),并指派进Something类别中,程序执行时就会使用我们指派的Execute服务进行程序了!这边我们采用的是newFixedThreadPool,可以指定需要创建的执行绪数量,程序实际就只会创建出指派数量的执行绪来重复利用。

这种隔一层的设计让我想到过去做专题时用过的DAO介面,我们在Service中写的都是定义为DAO介面型别的变数,而实际指派给变数的实例可以是连线池版本的DAO,或者是纯JDBC版本输入帐号密码创建连线的DAO,但不管指派哪种实例给变数,都不会影响Service实作的程序码!因为只要透过介面定义的方法及其方法签章,就能预期输入以及输出的东西是什麽了。官方Java API也利用这样隔一层的方式推出了Executor介面,程序中都可以先定义这个Executor,而实际要使用哪一种Executor实例就都可以再抽换。


<<:  [Day 21] 资料标注 (2/2) — 各种标注方法

>>:  [Day21]DML语句

Day 30 - 结语 : 从"预见到坚持"

终於来到今年铁人赛的最後一篇了~虽然都有预先写稿的习惯与准备, 但这次还真的是忙到最後一天才能抽空...

Power BI Course in Bangalore

IntelliMindz offers Power BI Course in Bangalore. ...

【第七天 - Flutter Api、Json 物件教学】

前言 今日的程序码 => GITHUB 这边我会用到 json_serializable 的套...

Day05 UIKit 04 - 在 Storyboard 上设计画面

在 Storyboard 上设计画面 接下来我们来在一开始建立的专案上设计画面,首先我们在专案导览器...

Day 23. 再一天列表渲染-更多的v-for

唉呀,今天再一篇v-for,不知道v-for分两篇会不会觉得太灌水,但我还是分两篇了✧*。٩(ˊᗜˋ...