在 Java 中使用 Thread 類代表線程,所有的線程對象都必須是 Thread 類或者其子類的實例,因此,創建線程實際上就是創建Thread類。本文我們向大家介紹3種創建線程的方式,為我們后面學習多線程埋下伏筆。
在Java 中有3種創建線程方式,下面一一學習:
1. 繼承 Thread 類
step 1 定義一個類繼承自 Thread 類,然后重寫該類的 run 方法,這個方法的內容表示線程要完成的任務
step 2 創建線程對象,即創建 Thread 類子類的實例
step 3 調用步驟二中創建出來的對象的 start 方法來啟動線程
public class CreateThreadByExtendsThread extends Thread {
@Override
public void run() {
IntStream.rangeClosed(1, 10).forEach(i -> System.out.println(Thread.currentThread().getName() + " " + i));
}
public static void main(String[] args) {
CreateThreadByExtendsThread threadOne = new CreateThreadByExtendsThread();
CreateThreadByExtendsThread threadTwo = new CreateThreadByExtendsThread();
CreateThreadByExtendsThread threadThree = new CreateThreadByExtendsThread();
threadOne.start();
threadTwo.start();
threadThree.start();
}
}
2.實現 Runnable 接口
step 1 定義一個類實現 Runnable 接口,然后實現該接口的 run 方法,這個方法的內容同樣也表示線程要完成的任務
step 2 創建 Runnable 接口實現類的實例,并使用該實例作為 Thraed 構造方法的參數創建 Thread 類的對象,該對象才是真正的線程對象
step 3 調用線程對象的 start 方法來啟動該線程
public class CreateThreadByImplementsRunnable implements Runnable {
@Override
public void run() {
IntStream.rangeClosed(1, 10).forEach(i -> System.out.println(Thread.currentThread().getName() + " " + i));
}
public static void main(String[] args) {
CreateThreadByImplementsRunnable target = new CreateThreadByImplementsRunnable();
new Thread(target, "thread-one").start();
new Thread(target, "thread-two").start();
new Thread(target, "thread-three").start();
}
}
3. 實現 Callable 接口
step 1 定義一個類實現 Callable 接口,然后實現該接口的 call 方法,這個方法的內容同樣也表示線程要完成的任務,并且有返回值
step 2 創建 Callable 接口實現類的實例,使用 FutureTask 類來包裝 Callable 對象,該 FutureTask 對象封裝了 Callable 對象的 call 方法的返回值
step 3 并使用 FutureTask 對象作為 Thraed 構造方法的參數創建 Thread 對象,并調用該對象的 start 方法啟動線程
step 4 調用 FutureTask 對象的 get 方法獲取線程執行結束后的返回值
public class CreateThreadByImplementsCallable implements Callable
@Override
public Integer call() {
AtomicInteger count = new AtomicInteger();
IntStream.rangeClosed(0, 10).forEach(i -> {
System.out.println(Thread.currentThread().getName() + " " + i);
count.getAndIncrement();
});
return count.get();
}
public static void main(String[] args) {
CreateThreadByImplementsCallable target = new CreateThreadByImplementsCallable();
FutureTask
IntStream.rangeClosed(0, 10).forEach(i -> {
System.out.println(Thread.currentThread().getName() + " 的循環變量 i 的值" + i);
if (i == 8) {
new Thread(futureTask, "有返回值的線程").start();
}
});
try {
System.out.println("有返回值線程的返回值:" + futureTask.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
通過以上可以看出,其實通過實現 Runnable 接口和實現 Callable 接口這兩種方式創建線程基本相同,采用實現 Runnable 和 Callable 接口的方式創建線程時,線程類只是實現接口,還可以繼承其它類(PS:Java 單繼承決定)。在這種方式下,多個線程可以共享同一個 target對象,所以非常適合多個相同線程來處理同一份資源的情況。還有一點就是,使用繼承 Thread 類的方式創建多線程時,編寫簡單,如果需要訪問當前線程,則無需使用 Thread.currentThread() 方法,直接使用 this 即可獲得當前線程。
最后,3種創建線程的方式已全部講完了,相信對于以上的內容有所了解和掌握吧,想要全方位學習Java多線程的小伙伴可以觀看本站的Java多線程教程,里面對多線程的講解很全面透徹,可以加深我們對多線程的理解。
一名合格的java工程師是必須要掌握java多線程的技能。線程是在編程中一定會出現使用的,多線程也是,那么你知道3種多線程程序常見形式有哪些,會在什么樣的程序中使用,這篇文章介紹多線程程序常見形式有什么。
在java語言中,學習好多線程無疑是至關重要的,多線程面試題在java程序員的面試中是常出現的,下面總結了一些常考的最新多線程面試題,大家可以一起來學習。
在Java多線程中,線程鎖的存在是為了解決資源占用的問題,保證同一時間一個對象只有一個線程在訪問,以此來保證數據的安全性。然而,線程鎖種類繁多,很多時候我們容易混淆概念,本文我們一起來看看線程鎖分類,詳細區分一下線程鎖的種類。
所謂守護線程是指在程序運行的時候在后臺提供一種通用服務的線程,比如垃圾回收線程就是一個很稱職的守護者,并且這種線程并不屬于程序中不可或缺的部分。因此,當所有的非守護線程結束時,程序也就終止了,同時會殺死進程中的所有守護線程。
jQuery是一個快速、簡潔的JavaScript框架
Java SE(Java Platform, Standard Edition,Java標準版),零基礎入門
IDEA 全稱 IntelliJ IDEA,是java編程語言開發的集成環境,它所提倡的是智能編碼,是減少程序員的工作
Java SE(Java Platform, Standard Edition,Java標準版),基礎進階
Git是一個開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目
Docker 是一個基于 Go 語言 并遵從 Apache2.0 協議開源的應用容器引擎,讓開發者可以打包應用到一個可移植的鏡像中
動力節點在線報名表(此信息已加密,請放心填寫)