Java建立多執行緒的四種方式
在進行講解執行緒的建立方式之前,首先了解下什麼是程式,什麼是執行緒,程式與執行緒之間的關係等
什麼是程式?
其實當一個程式進入記憶體執行時,就是一個程式,程式是處於執行中的程式,並且具有一定的獨立功能,程式是系統進行資源分配和排程的一個獨立單位,具有獨立性,動態性,併發性,這裡的獨立性指的是在系統中獨立存在,有獨立資源,有獨立地址空間,沒有程式允許,不會跟別的程式互動;動態性指的是程式在系統中有生命週期以及各種不同的狀態,這也是跟程式的區別,程式加入了時間的概念;併發性指的是程式間可以在單處理器上併發執行,獨立互不影響
那什麼是執行緒呢?
多執行緒其實就是擴充套件了多程式的概念,使一個程式可以同時併發處理多個任務,可以看成是輕量級的程式;執行緒是程式的組成部分,一個程式可以有多個執行緒,執行緒可以有自己的堆疊,程式計數器,區域性變數,但是沒有系統資源,執行緒是必須有一個父程式的,他與父程式的其他執行緒是共享全部資源,執行緒的排程與管理是由父程式負責為完成
簡單來說就是,作業系統可以同時執行多個任務,每個任務就是程式,程式可以同時執行多個任務,每個任務就是執行緒
如何建立多執行緒?
建立多執行緒的方式可以概括為四種:
1,繼承Thread類,重寫run()方法
2,實現Runnable介面,重寫run()方法
3,實現Callable介面, 重寫call()方法,藉助Future執行
4,藉助Executor框架使用執行緒池建立執行緒
具體執行緒建立方式如下:
一:繼承Thread類建立執行緒
|
|
---|---|
1
2
3
4
5
6
|
class
MyThead ``extends
Thread {
@Override
public
void
run() {
System.out.println(Thread.currentThread().getName() + ``": 繼承Thread執行緒啦"``);
}
}
|
呼叫線層的start()方法啟動執行緒
|
|
---|---|
1 |
new
MyThead().start(); |
執行結果如下:
注:Thread其實也是實現了Runnable介面
二:實現Runnable介面建立執行緒
|
|
---|---|
1
2
3
4
5
|
class
MyRunnable ``implements
Runnable {
public
void
run() {
System.out.println(Thread.currentThread().getName() + ``": 實現Runnable執行緒啦"``);
}
}
|
藉助Thread類呼叫線層的start()方法啟動執行緒
|
|
---|---|
1 |
new
Thread(``new
MyRunnable()) .start(); |
執行結果如下:
三:使用Callable和Future介面建立執行緒
Java5開始提供Callable介面,提供call方法作為執行緒的執行體,可以看成是Runnable介面的增強版本,增強點在於call()方法可以有返回值,並且可以丟擲異常,由於Callable是新增的介面,不能作為Thread的target使用,所以Java5裡提供了Future介面,該介面實現了Runnable,Future的實現類FutureTask類用來包裝Callable物件,那麼該怎麼呼叫並獲取返回值呢?下面用程式碼進行展示用法:
建立Callable物件
|
|
---|---|
1
2
3
4
5
6
7
8
9
|
class
MyCallable ``implements
Callable<Map<String, String>> {
public
Map<String, String> call() ``throws
Exception {
HashMap<String, String> map = ``new
HashMap<String, String>();
map.put(``"returnCode"``, ``"000000"``);
map.put(``"messgae"``, Thread.currentThread().getName() + ``":Callable建立執行緒成功"``);
return
map;
}
}
|
啟動執行緒
|
|
---|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
static
void
main(String[] args) {
FutureTask<Map<String, String>> future = ``new
FutureTask(``new
MyCallable());
new
Thread(future).start();
try
{
/**
* get()返回Callable任務裡的call()返回值
* get方法是一個阻塞方法,對於task內建了一些任務狀態,當任務狀態為新建0或者初始化完成的時候1的時候會阻塞
* 需要根據設定的時間阻塞,沒有設定時會一直進行阻塞,一直到有結果返回
*/
Map<String, String> resultMap = future.get();
System.out.println(resultMap);
} ``catch
(Exception e) {
e.printStackTrace();
}
}
|
執行結果如下:
四:藉助Executor框架使用執行緒池建立執行緒
- Executors提供了一系列工廠方法用於創先執行緒池,建立的執行緒池都實現了ExecutorService介面,下面為常用的執行緒池:
建立固定數目執行緒的執行緒池,操作一個共享的無邊界佇列,當所有執行緒都處於活動狀態時,額外的任務被提交它們將在佇列中等待,直到執行緒可用。當有執行緒池掛掉會重新建立一個新的
|
|
---|---|
1
2
3
4
5
|
public
static
ExecutorService newFixedThreadPool(``int
nThreads) {
return
new
ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new
LinkedBlockingQueue<Runnable>());
}
|
- 建立一個可快取的執行緒池,可以建立的範圍是0-Integer.MAX_VALUE,當有可用執行緒時直接使用,當沒有時建立新的執行緒並新增到快取中,提供使用,這種型別的執行緒池,適合執行許多短期的非同步任務的程式,是在執行方法之前建立執行緒,60秒內未使用的執行緒會被終止並刪除快取,
|
|
---|---|
1
2
3
4
5
|
public
static
ExecutorService newCachedThreadPool() {
return
new
ThreadPoolExecutor(``0``, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new
SynchronousQueue<Runnable>());
}
|
- 建立一個單執行緒化的Executor,只會有一個執行緒池,當這個執行緒池掛掉會自動建立一個新的
|
|
---|---|
1
2
3
4
5
6
|
public
static
ExecutorService newSingleThreadExecutor() {
return
new
FinalizableDelegatedExecutorService
(``new
ThreadPoolExecutor(``1``, ``1``,
0L, TimeUnit.MILLISECONDS,
new
LinkedBlockingQueue<Runnable>()));
}
|
- 建立一個支援定時及週期性的任務執行的執行緒池,多數情況下可用來替代Timer類
|
|
---|---|
1
2
3
|
public
static
ScheduledExecutorService newScheduledThreadPool(``int
corePoolSize) {
return
new
ScheduledThreadPoolExecutor(corePoolSize);
}
|
一般來說,CachedTheadPool在程式執行過程中通常會建立與所需數量相同的執行緒,然後在它回收舊執行緒時停止建立新執行緒,因此它是合理的Executor的首選,只有當這種方式會引發問題時(比如需要大量長時間面向連線的執行緒時),才需要考慮用FixedThreadPool
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983799/viewspace-2728766/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 執行緒建立的四種方式執行緒
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- Java建立多執行緒的幾種方式實現Java執行緒
- java執行緒建立的兩種方式Java執行緒
- Java建立多執行緒的一種方法Java執行緒
- 建立執行緒的三種方式執行緒
- Java實現多執行緒的三種方式Java執行緒
- Java 中執行緒池的7種建立方式!Java執行緒
- Java基礎:執行緒的三種建立方式Java執行緒
- 多執行緒的建立 兩種方式以及使用建議執行緒
- 【Java】執行緒的建立方式Java執行緒
- 執行緒池建立的幾種方式執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- Java併發(三)----建立執行緒的三種方式及檢視程式執行緒Java執行緒
- C++ 執行緒同步的四種方式C++執行緒
- java的執行緒、建立執行緒的 3 種方式、靜態代理模式、Lambda表示式簡化執行緒Java執行緒模式
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- 執行緒池的五種狀態及建立執行緒池的幾種方式執行緒
- java 四種執行緒池的使用Java執行緒
- Java四種執行緒池的使用Java執行緒
- Java多執行緒實現方式Java執行緒
- java建立執行緒池的幾中方式Java執行緒
- C++執行緒同步的四種方式(Windows)C++執行緒Windows
- Java多執行緒(四):volatileJava執行緒
- 【Java基礎】:執行緒的三種建立方式對比分析Java執行緒
- 多執行緒-多執行緒兩種方式的圖解比較及區別執行緒圖解
- Java 建立類的四種方式Java
- 最直白的方式直面Java多執行緒Java執行緒
- JAVA中執行緒建立的2種方法Java執行緒
- java自帶的四種執行緒池Java執行緒
- Java 四種執行緒池的用法分析Java執行緒
- android 建立多執行緒的幾種方法Android執行緒
- iOS 多執行緒的四種技術方案iOS執行緒
- Java多執行緒的建立和啟動Java執行緒
- jdk建立執行緒的方式JDK執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- 手撕Java多執行緒(四)執行緒之間的協作Java執行緒
- 多執行緒(四)執行緒