EasyThread通過對原生的執行緒池進行封裝,可讓你更方便的進行執行緒任務操作。
特性
- 簡單輕巧:方法數不過百,無額外次級依賴。
- 配置靈活:可方便、靈活的對每次所啟動的任務,配置執行緒名、執行緒優先順序等。
- 使用安全:當執行緒出現異常。能自動將catch異常資訊傳遞給使用者,避免出現crash。
- 執行緒切換:自帶執行緒切換功能:指定任務執行後,在哪個執行緒中進行使用者通知。
- 回撥通知:當任務啟動時與任務執行完畢後。有分別的生命週期作為通知。
- 任務擴充套件:支援延遲任務以及非同步回撥任務
依賴
// 新增jitPack倉庫使用
maven { url 'https://jitpack.io' }
// 新增依賴
compile "com.github.yjfnypeu:EasyThread:0.5.0"
複製程式碼
基本用法
使用方式分兩步走:
- 第一步:建立EasyThread例項。每個EasyThread例項會持有一個獨立的執行緒池提供使用。
EasyThread easyThread = EasyThread.Builder
//提供了四種create方法,用於根據需要建立不同型別的執行緒池進行使用
//比如createSingle():表示建立一個單例的執行緒池進行使用
.createXXX()
.build();
複製程式碼
- 第二步:使用建立的EasyThread例項進行任務執行:
EasyThread支援執行四種任務:
1. 普通Runnable任務
easyThread.execute(new Runnable(){
@Override
public void run() {
// do something.
}
});
複製程式碼
2. 普通Callable任務
Future task = easyThread.submit(new Callback<User>(){
@Override
public User call() throws Exception {
// do something
return user;
}
})
User result = task.get();
複製程式碼
3. 非同步回撥任務
// 非同步執行任務
Callable<User> callable = new Callable<User>(){
@Override
public User call() throws Exception {
// do something
return user;
}
}
// 非同步回撥
AsyncCallback<User> async = new AsyncCallback<User>() {
@Override
public void onSuccess(User user) {
// notify success;
}
@Override
public void onFailed(Throwable t) {
// notify failed.
}
};
// 啟動非同步任務
easyThread.async(callable, async)
複製程式碼
4. 延遲後臺任務
// 在啟動任務前,呼叫delay方法,指定延遲時間即可
easyThread.setDelay(time, unit)
.execute(runnable);
複製程式碼
e.g 延遲3秒啟動執行任務
easyThread.setDelay(3, TimeUnit.SECONDS)
.execute(task);
複製程式碼
高階配置
EasyThread提供了各種的額外配置,通過這些配置可以讓執行緒操作使用起來更加得心應手。
兩種配置方式
這裡我們以配置後臺優先順序進行說明:
1. 配置預設執行緒任務優先順序(預設配置)
EasyThread.Builder.createXXX().setPriority(priority);
複製程式碼
2. 配置當前執行緒任務優先順序(當前任務配置)
easyThread.setPriority(priority).execute(task);
複製程式碼
執行緒優先順序及執行緒名
配置方式:
easyThread.setName(name)// 配置執行緒任務名
.setPriority()// 配置執行緒執行優先順序
複製程式碼
任務回撥通知
介面說明:
public interface Callback {
// 執行緒任務啟動時的通知
void onStart (String threadName);
// 執行緒任務執行時出現異常時的通知
void onError (String threadName, Throwable t);
// 執行緒任務正常執行完成時的通知
void onCompleted (String threadName);
}
複製程式碼
配置方式:
easyThread.setCallback(callback);
複製程式碼
訊息派發器
訊息派發器用於訊息回撥執行緒切換,即指定回撥任務需要執行在什麼執行緒之上。
比如說在Android平臺,很常見的就是回撥時需要進行介面通知,所以這個時候就需要回撥通知執行在UI線,便於操作。
配置方式:
// 派發器的例項型別為java.util.concurrent.Executor子類
easyThread.setDeliver(deliver);
複製程式碼
在預設條件下(即未配置額外的派發器時),在Android或者Java平臺,分別適配了不同的回撥派發邏輯:
- 在純java環境下:回撥方法所執行的執行緒與任務執行執行緒一致
- 在Android環境:回撥方法預設執行於主執行緒
推薦配置
對於APP來說。執行緒資源是寶貴的。為了避免建立過多額外的執行緒,所以建議對每個app。提供一個統一的管理器維護所有的執行緒池,如下所示:
public final class ThreadManager {
private final static EasyThread io;
private final static EasyThread cache;
private final static EasyThread calculator;
private final static EasyThread file;
public static EasyThread getIO () {
return io;
}
public static EasyThread getCache() {
return cache;
}
public static EasyThread getCalculator() {
return calculator;
}
public static EasyThread getFile() {
return file;
}
static {
io = EasyThread.Builder.createFixed(6).setName("IO").setPriority(7).setCallback(new DefaultCallback()).build();
cache = EasyThread.Builder.createCacheable().setName("cache").setCallback(new DefaultCallback()).build();
calculator = EasyThread.Builder.createFixed(4).setName("calculator").setPriority(Thread.MAX_PRIORITY).setCallback(new DefaultCallback()).build();
file = EasyThread.Builder.createFixed(4).setName("file").setPriority(3).setCallback(new DefaultCallback()).build();
}
private static class DefaultCallback implements Callback {
@Override
public void onError(String threadName, Throwable t) {
MyLog.e("Task with thread %s has occurs an error: %s", threadName, t.getMessage());
}
@Override
public void onCompleted(String threadName) {
MyLog.d("Task with thread %s completed", threadName);
}
@Override
public void onStart(String threadName) {
MyLog.d("Task with thread %s start running!", threadName);
}
}
}
複製程式碼