Java四種線程創(chuàng)建方式示例代碼
一句話先給你總覽(先建立大腦地圖)
Java 創(chuàng)建線程 = 兩大類(lèi) + 四種方式
分類(lèi) | 方式 |
直接創(chuàng)建線程 | ① 繼承 |
② 實(shí)現(xiàn) | |
“高級(jí)”線程(推薦) | ③ 實(shí)現(xiàn) + |
④ 線程池 |
一、方式 ①:繼承 Thread(最直觀,但不推薦)
1.核心思想
線程 = 一個(gè)類(lèi)
任務(wù)寫(xiě)在 run() 里
2.代碼(你必須記住這個(gè)結(jié)構(gòu))
class MyThread extends Thread {
@Override
public void run() {
System.out.println("線程在執(zhí)行:" + Thread.currentThread().getName());
}
}
public class Test {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start(); // ?必須是 start()
}
}3.必須牢記的 2 個(gè)坑(面試 & 實(shí)戰(zhàn)必考)
不能調(diào)用 run()
t.run(); // 這不是多線程,只是普通方法調(diào)用
必須調(diào)用
t.start(); // JVM 創(chuàng)建新線程
Java 只能單繼承
class A extends Thread extends B // ? 不可能
4.什么時(shí)候用?
- 學(xué)習(xí)
- Demo
- 面試講原理
真實(shí)項(xiàng)目基本不用
二、方式 ②:實(shí)現(xiàn) Runnable
1.核心思想(非常重要)
線程(Thread) ≠ 任務(wù)(Runnable)
Runnable:你要做什么Thread:誰(shuí)來(lái)執(zhí)行
解耦思想(面試高頻)
2.標(biāo)準(zhǔn)寫(xiě)法(必須背)
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("線程執(zhí)行:" + Thread.currentThread().getName());
}
}
public class Test {
public static void main(String[] args) {
Runnable task = new MyRunnable();
Thread t = new Thread(task);
t.start();
}
}3.為什么它比繼承 Thread 好?
可以繼承別的類(lèi)
多個(gè)線程共享同一個(gè)任務(wù)
符合面向?qū)ο笤O(shè)計(jì)
4.一個(gè)非常關(guān)鍵的共享例子(一定要看)
class TicketTask implements Runnable {
private int ticket = 100;
public void run() {
while (ticket > 0) {
System.out.println(Thread.currentThread().getName()
+ " 賣(mài)出第 " + ticket-- + " 張票");
}
}
}
public static void main(String[] args) {
TicketTask task = new TicketTask();
new Thread(task, "窗口1").start();
new Thread(task, "窗口2").start();
}同一個(gè) task,被多個(gè)線程執(zhí)行
5.什么時(shí)候用?
99% 的普通多線程場(chǎng)景
三、方式 ③:Callable + Future(能返回結(jié)果)
1.為什么需要它?
前兩種:
- 不能返回結(jié)果
- 不能拋受檢異常
Callable = 帶返回值的 Runnable
2.代碼(結(jié)構(gòu)一定要搞懂)
import java.util.concurrent.*;
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
Thread.sleep(1000);
return 100;
}
}
public class Test {
public static void main(String[] args) throws Exception {
Callable<Integer> task = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<>(task);
Thread t = new Thread(futureTask);
t.start();
Integer result = futureTask.get(); // 阻塞等待結(jié)果
System.out.println("結(jié)果:" + result);
}
}3.關(guān)鍵角色理解(一定要清楚)
類(lèi) | 作用 |
| 定義任務(wù)(有返回值) |
| 任務(wù) + 結(jié)果容器 |
| 等待線程執(zhí)行完成 |
4.什么時(shí)候用?
- 異步計(jì)算
- 并行任務(wù)
- 需要返回結(jié)果
四、方式 ④:線程池
1.為什么一定要用線程池?
直接 new Thread 的問(wèn)題:
- 線程創(chuàng)建/銷(xiāo)毀開(kāi)銷(xiāo)大
- 不可控
- 容易 OOM
線程池:
- 線程復(fù)用
- 統(tǒng)一管理
- 性能 & 穩(wěn)定性最好
2.最基礎(chǔ)用法(你先會(huì)這個(gè))
ExecutorService pool = Executors.newFixedThreadPool(3);
pool.execute(() -> {
System.out.println(Thread.currentThread().getName());
});
pool.shutdown();3.提交 Runnable / Callable
// Runnable
pool.execute(() -> System.out.println("無(wú)返回值"));
// Callable
Future<Integer> f = pool.submit(() -> 1 + 2);
System.out.println(f.get());4.真實(shí)項(xiàng)目用什么?
線程池 + Runnable / Callable
五、四種方式終極對(duì)比(背這個(gè)就夠)
方式 | 返回值 | 繼承限制 | 推薦指數(shù) |
繼承 Thread | ? | ? | ? |
Runnable | ? | ? | ???? |
Callable | ? | ? | ???? |
線程池 | ? | ? | ????? |
六、面試一句話總結(jié)(直接抄)
Java 創(chuàng)建線程有四種方式:繼承 Thread、實(shí)現(xiàn) Runnable、實(shí)現(xiàn) Callable 結(jié)合 Future、以及使用線程池。
實(shí)際開(kāi)發(fā)中推薦使用線程池 + Runnable/Callable,避免直接創(chuàng)建線程。
七、給你 3 道自測(cè)題(你能答出來(lái)就是真的會(huì)了)
?1
run() 和 start() 有什么區(qū)別?
?2
為什么不推薦繼承 Thread?
?3
線程池解決了什么問(wèn)題?
總結(jié)
到此這篇關(guān)于Java四種線程創(chuàng)建方式的文章就介紹到這了,更多相關(guān)Java線程創(chuàng)建方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解
這篇文章主要為大家介紹了最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)詳解
堆(優(yōu)先隊(duì)列)是一種典型的數(shù)據(jù)結(jié)構(gòu),其形狀是一棵完全二叉樹(shù),一般用于求解topk問(wèn)題。本文將利用Java語(yǔ)言實(shí)現(xiàn)堆,感興趣的可以學(xué)習(xí)一下2022-07-07
Spring中的BeanFactory類(lèi)入門(mén)到精通
BeanFactory是Spring框架的IoC容器接口,提供Bean的生命周期管理、依賴注入和配置元數(shù)據(jù),它支持懶加載策略,并通過(guò)實(shí)現(xiàn)類(lèi)如DefaultListableBeanFactory來(lái)完成具體的Bean創(chuàng)建和依賴注入,本文介紹Spring中的BeanFactory類(lèi),感興趣的朋友跟隨小編一起看看吧2025-12-12
詳解在springmvc中解決FastJson循環(huán)引用的問(wèn)題
本篇文章主要介紹了在springmvc中解決FastJson循環(huán)引用的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
Java實(shí)現(xiàn)獲取一段文字中文字符數(shù)量的工具類(lèi)
隨著互聯(lián)網(wǎng)時(shí)代的到來(lái),各類(lèi)應(yīng)用中對(duì)于文本的處理日益頻繁,本文將設(shè)計(jì)實(shí)現(xiàn)一個(gè)通用的 Java 工具類(lèi),能夠高效準(zhǔn)確地統(tǒng)計(jì)一段文本中 中文字符的數(shù)量,感興趣的可以了解下2025-07-07
使用java?-Dloader.path=./lib?-jar啟動(dòng)應(yīng)用的完整實(shí)踐指南
java -Dloader.path="lib/" -jar XXXX.jar是一個(gè)用于啟動(dòng)Java 應(yīng)用程序的命令,這篇文章主要介紹了使用java?-Dloader.path=./lib?-jar啟動(dòng)應(yīng)用的完整實(shí)踐指南,文中給出了詳細(xì)代碼示例,需要的朋友可以參考下2025-10-10

