ThreadPoolExecutor原始碼分析

2021-09-10 18:05:35 字數 3734 閱讀 1392

executorservice主要使用執行緒池中的可用執行緒執行提交的任務,主要用於解決兩個不同的問題:執行大量非同步任務時改善效能和管理資源。

threadpoolexecutor.abortpolicy: 丟棄任務,並丟擲rejectedexecutionexception異常

threadpoolexecutor.callerrunspolicy: 通過呼叫execute方法的執行緒直接處理被拒絕的任務,除非執行緒池被shutdown,那麼這個任務會被丟棄

threadpoolexecutor.discardoldestpolicy: 將最早插入佇列且未被處理的任務丟棄,並且重新執行execute方法,除非執行緒池被shutdown,那麼這個任務會被丟棄

threadpoolexecutor.discardpolicy: 直接丟棄任務,沒有拋任何的異常資訊

running (執行狀態): 能接受新提交的任務, 並且也能處理阻塞佇列中的任務.

stop(停止狀態) : 不能接受新提交的任務, 也不能處理阻塞佇列中已儲存的任務, 並且會中斷正在處理中的任務.呼叫 shutdownnow() 方法會使執行緒池進入到該狀態.

tidying (清理狀態): 所有的任務都已終止了, workercount (有效執行緒數) 為0, 執行緒池進入該狀態後會呼叫 terminated() 方法以讓該執行緒池進入terminated 狀態. 當執行緒池處於 shutdown 狀態時, 如果此後執行緒池內沒有執行緒了並且阻塞佇列內也沒有待執行的任務了 (即: 二者都為空), 執行緒池就會進入到該狀態. 當執行緒池處於 stop 狀態時, 如果此後執行緒池內沒有執行緒了, 執行緒池就會進入到該狀態.

terminated (終止狀態): terminated() 方法執行完後就進入該狀態.

/**

* 在之後的某個時間點執行給定的任務,這個任務會被新建立的執行緒或執行緒池中已經存在的執行緒執行

* 如果任務不能被提交執行,造成這個問題的原因是:執行緒池被shutdown

* 或執行緒池中的執行緒容量達到最大值,任務被具體的拒絕策略處理

* /public void execute(runnable command)

// 執行緒池處於running狀態,並且任務加入到workqueue

if (isrunning(c) && workqueue.offer(command))

//加入佇列失敗,建立新從執行緒,並啟動執行任務

else if (!addworker(command, false))

reject(command);

}

/** 

* 該方法主要功能為建立乙個worker任務,將worker加入到set集合中,並執行提交的任務

* /private boolean addworker(runnable firsttask, boolean core)

}// 建立worker任務,並啟動執行

boolean workerstarted = false;

boolean workeradded = false;

worker w = null;

try

} finally

if (workeradded)

}} finally

return workerstarted;

}

/** 

* worker類主要保留執行緒執行任務的中斷狀態,使用獨佔鎖

* /private final class worker

extends abstractqueuedsynchronizer

implements runnable

/** delegates main run loop to outer runworker */

public void run()

// lock methods

//// the value 0 represents the unlocked state.

// the value 1 represents the locked state.

protected boolean isheldexclusively()

protected boolean tryacquire(int unused)

return false;

}protected boolean tryrelease(int unused)

public void lock()

public boolean trylock()

public void unlock()

public boolean islocked()

void interruptifstarted() catch (securityexception ignore) }}

}

/**

* 迴圈從queue中獲取任務,並執行

* /final void runworker(worker w) catch (runtimeexception x) catch (error x) catch (throwable x) finally

} finally

}completedabruptly = false;

} finally

}

/** 

* 清理動作

* /private void processworkerexit(worker w, boolean completedabruptly) finally

// 嘗試終止執行緒池

tryterminate();

// 執行緒池未被終止,保留最小執行緒數

int c = ctl.get();

if (runstatelessthan(c, stop))

addworker(null, false);

}}

/**

* 嘗試終止執行緒:

* /final void tryterminate()

final reentrantlock mainlock = this.mainlock;

mainlock.lock();

try finally

return;

}} finally

// else retry on failed cas

}}

/**

* 終止執行緒,終止之前提交的任務會被執行,但是新的任務不會被接收。重複呼叫不會有任何影響

* 這個方法不會等待先前提交的任務被完全執行,可以使用awaittermination做這個事

* /public void shutdown() finally

// 嘗試終止執行緒

tryterminate();

}

/**

* 試圖停止所有正在執行的任務,暫停正在處理中的任務,返回等待執行的任務列表。這些任務

* 會從queue中移除並被返回。

* 這個方法不會等待正在執行的任務終止。使用awaittermination來終止。

* /public listshutdownnow() finally

//嘗試終止執行緒

tryterminate();

return tasks;

}

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...

AbstractListView原始碼分析3

normal list that does not indicate choices public static final int choice mode none 0 the list allows up to one choice public static final int choice ...

Android AsyncTask原始碼分析

android中只能在主線程中進行ui操作,如果是其它子執行緒,需要借助非同步訊息處理機制handler。除此之外,還有個非常方便的asynctask類,這個類內部封裝了handler和執行緒池。本文先簡要介紹asynctask的用法,然後分析具體實現。asynctask是乙個抽象類,我們需要建立子...