Java多線程專(zhuān)題之線程類(lèi)和接口入門(mén)

前言
大家好,一直以來(lái)我都本著用最通俗的話理解核心的知識(shí)點(diǎn), 我認(rèn)為所有的難點(diǎn)都離不開(kāi) 「基礎(chǔ)知識(shí)」 的鋪墊。目前正在出一個(gè)Java多線程專(zhuān)題長(zhǎng)期系列教程,從入門(mén)到進(jìn)階, 篇幅會(huì)較多, 喜歡的話,給個(gè)關(guān)注?? ~
適合人群
- 有一定的Java基礎(chǔ)
- 想學(xué)習(xí)或了解多線程開(kāi)發(fā)
- 想提高自己的同學(xué)
- 「大佬可以繞過(guò) ~」
背景
之前給大家講了一些框架的使用,這些都屬于業(yè)務(wù)層面的東西,你需要熟練掌握它并在項(xiàng)目中會(huì)運(yùn)用它即可,但這些對(duì)自身技術(shù)的積累是遠(yuǎn)遠(yuǎn)不夠的,如果你想要提高自己,對(duì)于語(yǔ)言本身你需要花更多的時(shí)間去挖掘而不是局限于框架的使用,所以之前為什么跟大家一直強(qiáng)調(diào)基礎(chǔ)的重要性,框架可以千變?nèi)f化,層出不窮,但是基礎(chǔ)它是不變的,不管是學(xué)java還是前端或者是其它語(yǔ)言, 這一點(diǎn)大家還是需要認(rèn)清的。
接下來(lái)的幾期會(huì)專(zhuān)門(mén)講多線程這一塊,篇幅會(huì)較多,耐心看完你一定會(huì)有收獲~
情景回顧
上期帶大家學(xué)習(xí)了什么是進(jìn)程什么是線程,理解了它們的基本概念,本期正式學(xué)習(xí)Java多線程開(kāi)發(fā),本節(jié)主要帶大家入門(mén),認(rèn)識(shí)一些常用的類(lèi)和接口,我們一起來(lái)看一下吧~
Thread 類(lèi)
在JDK中,提供了一個(gè)Thread類(lèi),我們只需要繼承這個(gè)類(lèi),就可以實(shí)現(xiàn)多線程:
public class ThreadTest {
public static class MyThread extends Thread {
public void run() {
System.out.println("hello 2");
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
// 啟用線程 (不調(diào)用是沒(méi)法啟動(dòng)的)
myThread.start();
System.out.println("hello 1");
}
}
最后結(jié)果輸出:
hello 1
hello 2
我們可以發(fā)現(xiàn)hello2明明在上面運(yùn)行,為啥最后輸出,因?yàn)樗鼏?dòng)的是獨(dú)立的線程執(zhí)行,所以不會(huì)造成阻塞,所以調(diào)用start的時(shí)候,后續(xù)代碼會(huì)繼續(xù)執(zhí)行,無(wú)需等待hello2的結(jié)果。
那么我可以調(diào)用多次start嗎?這樣是不是可以多開(kāi)幾個(gè)線程,我們?cè)囋嚳矗?/p>
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("hello 1");
myThread.start();
}
運(yùn)行一下:
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:710)
at com.thread.base.ThreadTest.main(ThreadTest.java:23)
好家伙,直接報(bào)錯(cuò),那么原因是什么呢?
為什么start()不可以調(diào)用多次
首先我們要明白,Java中,線程是不允許啟動(dòng)兩次的,啟動(dòng)第二次就會(huì)拋出IllegalThreadStateException的異常。那么這個(gè)異常為啥拋呢?我們只要找到start方法中拋這個(gè)異常的地方不就好了,下面我們看下源碼:
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
....
}
好家伙,點(diǎn)進(jìn)去就找到了,說(shuō)明,每次調(diào)用的時(shí)候,首先都會(huì)判斷 threadStatus 是否為0。這個(gè)0代表的是線程N(yùn)EW狀態(tài),也就是說(shuō)第二次調(diào)用線程可能會(huì)處于非NEW狀態(tài)。其實(shí)這里涉及到線程生命周期的概念了,先不給大家講解, 后邊給大家講,這一節(jié),我們先入門(mén)。
Runnable 接口
我們還可以通過(guò)實(shí)現(xiàn)Runnable接口,來(lái)開(kāi)啟多線程。我們來(lái)看一下:
public class RunnableTest {
public static class MyThread implements Runnable {
public void run() {
System.out.println("hello 2");
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
System.out.println("hello 1");
}
}
看下輸出:
hello 1
hello 2
new Thread,其實(shí)還有通過(guò)java8的特性表達(dá)式,還可以這樣使用:
new Thread(() -> {
System.out.println("hello3");
}).start();
這樣也可以開(kāi)啟一個(gè)多線程。
結(jié)束語(yǔ)
本期到這里就結(jié)束了, 總結(jié)一下,本節(jié)主要講了Thread類(lèi)和Runnable接口,以及帶大家實(shí)際操作了一下,大家可以自己多試試。
























