成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

java線程池的原理學(xué)習(xí)

Taonce / 3348人閱讀

摘要:而中直接將任務(wù)交給運行再來看創(chuàng)建一個保存所有的結(jié)果運行任務(wù)依次取結(jié)果這里使用是為了等待運行完成,如果沒完成就會阻塞如果發(fā)生異常,則取消所有任務(wù)續(xù)線程池的原理學(xué)習(xí)二

Executor接口

如果查看jdk文檔,會發(fā)現(xiàn)java線程池都源自于這個超級接口Executor,但是這個接口本身比較簡單:

public interface Executor {

    /**
        在未來某個時間執(zhí)行給定的命令。該命令可能在新的線程、已入池的線程或者正調(diào)用的線程中執(zhí)行,
        這由 Executor 實現(xiàn)決定。
     *
     * @param command the runnable task
     * @throws RejectedExecutionException if this task cannot be
     * accepted for execution.
     * @throws NullPointerException if command is null
     */
    void execute(Runnable command);
}

可以看到Executor 中只有一個execute 方法。此接口提供一種將任務(wù)提交與每個任務(wù)將如何運行的機制分離開來的方法,相比較為每個人物調(diào)用new Thread(Runnable r).start() ,我們更偏向于使用Executor (執(zhí)行器)來運行任務(wù):

Executor executor = anExecutor;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
 ...

實現(xiàn)一個執(zhí)行器也很簡單:

class ThreadPerTaskExecutor implements Executor {
     public void execute(Runnable r) {
         new Thread(r).start();
     }
 }
ExecutorService接口

Executor 提供的方法太少了!根本不能滿足日常所需,而從它派生下來的接口ExecutorService 則顯得更通用,畢竟它也是個Service。

public interface ExecutorService extends Executor {
    void shutdown();
    List shutdownNow();
    boolean isShutdown();
    boolean isTerminated();    
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;   
     Future submit(Callable task);   
     Future submit(Runnable task, T result);
    Future submit(Runnable task);
     List> invokeAll(Collection> tasks)
        throws InterruptedException;  
     T invokeAny(Collection> tasks) 
        throws InterruptedException, ExecutionException; 
     ...
}

可以看到,ExecutorService 接口中包含了我們平常使用的線程池的絕大多數(shù)方法,其中的一些方法在上文已經(jīng)介紹過了。

AbstractExecutorService

AbstractExecutorService是一個抽象類,并且實現(xiàn)了ExecutorService接口。

public abstract class AbstractExecutorService implements ExecutorService

在這個類中,提供了ExecutorService 一些方法的默認實現(xiàn),比如submit ,invokeAll ,首先看submit 的實現(xiàn):

public  Future submit(Callable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
}

其中使用了newTaskFor 方法:

protected  RunnableFuture newTaskFor(Callable callable) {
        return new FutureTask(callable);
}

newTaskFor 方法只是簡單的將給定可調(diào)用任務(wù)包裝成一個RunnableFuture ,使其具有取消運行的特性。而submit 中直接將任務(wù)交給execute() 運行.
再來看invokeAll() :

public  List> invokeAll(Collection> tasks)
        throws InterruptedException {
        if (tasks == null)
            throw new NullPointerException();
        //創(chuàng)建一個list保存所有的結(jié)果
        List> futures = new ArrayList>(tasks.size());
        boolean done = false;
        try {
            for (Callable t : tasks) {
                RunnableFuture f = newTaskFor(t);
                futures.add(f);
                execute(f);   //運行任務(wù)
            }
            for (Future f : futures) {
                if (!f.isDone()) {    //依次取結(jié)果
                    try {
                        f.get();     //這里使用get是為了等待運行完成,如果沒完成就會阻塞
                    } catch (CancellationException ignore) {
                    } catch (ExecutionException ignore) {
                    }
                }
            }
            done = true;
            return futures;
        } finally {
            if (!done)   //如果發(fā)生異常,則取消所有任務(wù)
                for (Future f : futures)
                    f.cancel(true);
        }
    }

續(xù):java線程池的原理學(xué)習(xí)(二)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/64434.html

相關(guān)文章

  • java線程池的原理學(xué)習(xí)(三)

    摘要:接上文線程池的原理學(xué)習(xí)二深入剖析線程池的五種狀態(tài)類中將線程狀態(tài)分為了以下五種可以接受新任務(wù)并且處理進入隊列中的任務(wù)不接受新任務(wù),但是仍然執(zhí)行隊列中的任務(wù)不接受新任務(wù)也不執(zhí)行隊列中的任務(wù)所有任務(wù)中止,隊列為空,進入該狀態(tài)下的任務(wù)會執(zhí)行方法方法 接上文:java線程池的原理學(xué)習(xí)(二) ThreadPoolExecutor深入剖析 線程池的五種狀態(tài) ThreadPoolExecutor 類中...

    mgckid 評論0 收藏0
  • 后端ing

    摘要:當(dāng)活動線程核心線程非核心線程達到這個數(shù)值后,后續(xù)任務(wù)將會根據(jù)來進行拒絕策略處理。線程池工作原則當(dāng)線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請求。當(dāng)線程池中的數(shù)量等于最大線程數(shù)時默默丟棄不能執(zhí)行的新加任務(wù),不報任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點記錄以及采用的解決方案 深入分析 java 線程池的實現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...

    roadtogeek 評論0 收藏0
  • java線程池的原理學(xué)習(xí)(二)

    摘要:接上文線程池的原理學(xué)習(xí)簡單介紹,線程池類,繼承自構(gòu)造方法提供了四種構(gòu)造方法實現(xiàn)這里只介紹一種有必要對每個參數(shù)解釋一下池中所保存的線程數(shù),包括空閑線程。文檔中提供了一個可以暫停和恢復(fù)的線程池例子運行原理線程池的原理學(xué)習(xí)三 接上文:java線程池的原理學(xué)習(xí) ThreadPoolExecutor簡單介紹 ThreadPoolExecutor,線程池類,繼承自 AbstractExecutor...

    oujie 評論0 收藏0
  • Java線程池的工作原理,好處和注意事項

    摘要:線程池的工作原理一個線程池管理了一組工作線程,同時它還包括了一個用于放置等待執(zhí)行任務(wù)的任務(wù)隊列阻塞隊列。使用線程池可以對線程進行統(tǒng)一的分配和監(jiān)控。線程池的注意事項雖然線程池是構(gòu)建多線程應(yīng)用程序的強大機制,但使用它并不是沒有風(fēng)險的。 線程池的工作原理一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執(zhí)行 任務(wù)的任務(wù)隊列(阻塞隊列) 。 一個線程池管理了一組工作線程, 同時它還...

    ZweiZhao 評論0 收藏0
  • 并發(fā)學(xué)習(xí)筆記 (6)

    摘要:每個通過網(wǎng)絡(luò)到達服務(wù)器的連接都被包裝成一個任務(wù)并且傳遞給線程池。線程池的線程會并發(fā)的處理連接上的請求。用線程池控制線程數(shù)量,其他線程排隊等候。實現(xiàn)包,線程池頂級接口是但是嚴格意義講并不是一個線程。此線程池支持定時以及周期性執(zhí)行任務(wù)的需求。 tutorial site1tutorial site2 一個問題: 每啟動一個新線程都會有相應(yīng)的性能開銷(涉及到OS的交互:創(chuàng)建線程,銷毀線程...

    superw 評論0 收藏0

發(fā)表評論

0條評論

Taonce

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<