java executors框架_Java多線程Executors框架

1.之前實現線程有三種方式

繼承Thread類,實現Runnable或者Callable接口。

如果實現Runnable或者Callable接口,需要Thread幫我們啟動,但是現在提供了Executor幫助我們管理並執行實現了Runnable和Callable的類。

2.Executor的繼承關系

668b33b58cc7e9f46bf9b620044b0aec.png

其中Executor接口是提供了一種方法execute(Runnable run)用來執行定義的任務;

public interfaceExecutor {/*** Executes the given command at some time in the future. The command

* may execute in a new thread, in a pooled thread, or in the calling

* thread, at the discretion of the Executor implementation.*/

voidexecute(Runnable command);

}

接口ExecutorServices實現了Executor接口,但是沒有實現executue()方法;並提供了submit()方法執行任務;

public interface ExecutorService extendsExecutor {/*** Submits a Runnable task for execution and returns a Future

* representing that task. The Future's get method will

* return the given result upon successful completion.

*

使用submit()方法提交要執行的任務,

返回Future對象,Future保存的是其他線程異步執行的結果;

如果不需要返回結果的話,可以調用ThreadPoolExecutor實現的execute()方法執行任務;*/ Future submit(Callable task);}

ThreadPoolExecutor實現了Executor接口

public class ThreadPoolExecutor extendsAbstractExecutorService {/**ThreadPoolExecutor的構造函數,用來創建一個線程池

corePoolSize:線程池的大小

maxinumPoolSize:線程池中允許同時執行的最多線程數;

keepAliveTime:如果線程池中線程的數量>corePoolSize,且超過的部分線程空閑時間>keepAliveTime會被銷毀;

unit:keepAliveTime的單位;

workQueue:在任務被執行之前持有任務直到任務被執行;

如果線程池中的線程數量corePoolSize,將新任務放入隊列中,等待執行;如果隊列已滿且線程數量

線程執行任務;*/

public ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,

TimeUnit unit,

BlockingQueueworkQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler) {if (corePoolSize < 0 ||maximumPoolSize<= 0 ||maximumPoolSize< corePoolSize ||keepAliveTime< 0)throw newIllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw newNullPointerException();this.corePoolSize =corePoolSize;this.maximumPoolSize =maximumPoolSize;this.workQueue =workQueue;this.keepAliveTime =unit.toNanos(keepAliveTime);this.threadFactory =threadFactory;this.handler =handler;

}/** ThreadPoolExecutor了execute方法,具體實現細節以后再說

**/

public voidexecute(Runnable command) {if (command == null)throw newNullPointerException();int c =ctl.get();if (workerCountOf(c)

c=ctl.get();

}if (isRunning(c) &&workQueue.offer(command)) {int recheck =ctl.get();if (! isRunning(recheck) &&remove(command))

reject(command);else if (workerCountOf(recheck) == 0)

addWorker(null, false);

}else if (!addWorker(command, false))

reject(command);

}

}

除了上面的幾個類或接口之外,還有一個比較重要的類 Executors;該類是一個工廠類,能夠產出幾種不同的線程池;

public classExecutors {/** 利用ThreadPoolExecutor生成固定的線程池*/

public static ExecutorService newFixedThreadPool(intnThreads) {return newThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue());

}public staticExecutorService newSingleThreadExecutor() {return newFinalizableDelegatedExecutorService

(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue()));

}/***這個線程池可以重用重用線程,當線程池沒有可用的線程時,新建線程;如果一個線程超過60s沒有被使用,那該線程將從線程池中移除;

**/

public staticExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue());

}

}

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

网易数帆

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值