ExecutorService常用方法和newFixedThreadPool建立固定大小的執行緒池

n8765發表於2015-04-29
1、ExecutorService:
2、Executor:
3、Executors:
4、建立ExecutorService的方法:
5、ExecutorService的方法:
6、下面是相關的使用例子:

1、ExecutorService:
是一個介面,繼承了Executor:
public interface ExecutorService extends Executor {
}
2、Executor:
而Executor亦是一個介面,該介面只包含了一個方法:
void execute(Runnable command);
3、Executors:
該類是一個輔助類,此包中所定義的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 類的工廠和實用方法。
此類支援以下各種方法:
• 建立並返回設定有常用配置字串的 ExecutorService 的方法。
• 建立並返回設定有常用配置字串的 ScheduledExecutorService 的方法。
• 建立並返回“包裝的”ExecutorService 方法,它通過使特定於實現的方法不可訪問來禁用重新配置。
• 建立並返回 ThreadFactory 的方法,它可將新建立的執行緒設定為已知的狀態。
• 建立並返回非閉包形式的 Callable 的方法,這樣可將其用於需要 Callable 的執行方法中。
4、建立ExecutorService的方法:
newFixedThreadPool()
建立一個可重用固定執行緒數的執行緒池,以共享的無界佇列方式來執行這些執行緒。
5、ExecutorService的方法:
shutdown
void shutdown()
啟動一次順序關閉,執行以前提交的任務,但不接受新任務。如果已經關閉,則呼叫沒有其他作用。
丟擲:
SecurityException - 如果安全管理器存在並且關閉,此 ExecutorService 可能操作某些不允許呼叫者修改的執行緒(因為它沒有保持 RuntimePermission("modifyThread")),或者安全管理器的 checkAccess 方法拒絕訪問。
啟動一次順序關閉,執行以前提交的任務,但不接受新任務。如果已經關閉,則呼叫沒有其他作用。
awaitTermination
boolean awaitTermination(long timeout,
                         TimeUnit unit)
                         throws InterruptedException
請求關閉、發生超時或者當前執行緒中斷,無論哪一個首先發生之後,都將導致阻塞,直到所有任務完成執行。
引數:
timeout - 最長等待時間
unit - timeout 引數的時間單位
返回:
如果此執行程式終止,則返回 true;如果終止前超時期滿,則返回 false
丟擲:
InterruptedException - 如果等待時發生中斷
請求關閉、發生超時或者當前執行緒中斷,無論哪一個首先發生之後,都將導致阻塞,直到所有任務完成執行。既是等待所有子執行緒執行結束。
execute
void execute(Runnable command)
在未來某個時間執行給定的命令。該命令可能在新的執行緒、已入池的執行緒或者正呼叫的執行緒中執行,這由 Executor實現決定。
引數:
command - 可執行的任務
丟擲:
RejectedExecutionException - 如果不能接受執行此任務。
NullPointerException - 如果命令為 null
在未來某個時間執行給定的命令。該命令可能在新的執行緒、已入池的執行緒或者正呼叫的執行緒中執行,這由 Executor 實現決定。
submit
Future<?> submit(Runnable task)
提交一個 Runnable 任務用於執行,並返回一個表示該任務的 Future。該 Future 的 get 方法在成功 完成時將會返回 null。
引數:
task - 要提交的任務
返回:
表示任務等待完成的 Future
丟擲:
RejectedExecutionException - 如果任務無法安排執行
NullPointerException - 如果該任務為 null
提交一個 Runnable 任務用於執行,並返回一個表示該任務的 Future。該 Future 的 get 方法在成功 完成時將會返回 null。
6、下面是相關的使用例子:
public class ExecutorServiceTest {

    public static void main(String[] args) throws IOException, InterruptedException {
        // 建立一個固定大小的執行緒池
        ExecutorService service = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            System.out.println("建立執行緒" + i);
            Runnable run = new Runnable() {
                @Override
                public void run() {
                    System.out.println("啟動執行緒");
                }
            };
            // 在未來某個時間執行給定的命令
            service.execute(run);
        }
        // 關閉啟動執行緒
        service.shutdown();
        // 等待子執行緒結束,再繼續執行下面的程式碼
        service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
        System.out.println("all thread complete");
    }
}
可以發現執行緒被迴圈建立,但是啟動執行緒卻不是連續的,而是由ExecutorService決定的。

相關文章