一篇文章帶你入門java多線程
一、描述
Java 給多線程編程提供了內(nèi)置的支持。 一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。
多線程是多任務(wù)的一種特別的形式,但多線程使用了更小的資源開銷。
這里定義和線程相關(guān)的另一個(gè)術(shù)語 - 進(jìn)程:一個(gè)進(jìn)程包括由操作系統(tǒng)分配的內(nèi)存空間,包含一個(gè)或多個(gè)線程。一個(gè)線程不能獨(dú)立的存在,它必須是進(jìn)程的一部分。一個(gè)進(jìn)程一直運(yùn)行,直到所有的非守護(hù)線程都結(jié)束運(yùn)行后才能結(jié)束。
多線程能滿足程序員編寫高效率的程序來達(dá)到充分利用 CPU 的目的。
二、一個(gè)線程的生命周期
1. 初始(NEW):新創(chuàng)建了一個(gè)線程對(duì)象,但還沒有調(diào)用start()方法。
2. 運(yùn)行(RUNNABLE):Java線程中將就緒(ready)和運(yùn)行中(running)兩種狀態(tài)籠統(tǒng)的稱為“運(yùn)行”。
線程對(duì)象創(chuàng)建后,其他線程(比如main線程)調(diào)用了該對(duì)象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中,獲取CPU的使用權(quán),此時(shí)處于就緒狀態(tài)(ready)。就緒狀態(tài)的線程在獲得CPU時(shí)間片后變?yōu)檫\(yùn)行中狀態(tài)(running)。
3. 阻塞(BLOCKED):表示線程阻塞于鎖。
4. 等待(WAITING):進(jìn)入該狀態(tài)的線程需要等待其他線程做出一些特定動(dòng)作(通知或中斷)。
5. 超時(shí)等待(TIMED_WAITING):該狀態(tài)不同于WAITING,它可以在指定的時(shí)間后自行返回。
6. 終止(TERMINATED):表示該線程已經(jīng)執(zhí)行完畢。
三、線程的優(yōu)先級(jí)
每一個(gè) Java 線程都有一個(gè)優(yōu)先級(jí),這樣有助于操作系統(tǒng)確定線程的調(diào)度順序。
Java 線程的優(yōu)先級(jí)是一個(gè)整數(shù),其取值范圍是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。
默認(rèn)情況下,每一個(gè)線程都會(huì)分配一個(gè)優(yōu)先級(jí) NORM_PRIORITY(5)。
具有較高優(yōu)先級(jí)的線程對(duì)程序更重要,并且應(yīng)該在低優(yōu)先級(jí)的線程之前分配處理器資源。但是,線程優(yōu)先級(jí)不能保證線程執(zhí)行的順序,而且非常依賴于平臺(tái)。
四、創(chuàng)建線程
Java 提供了三種創(chuàng)建線程的方法:
1、通過實(shí)現(xiàn) Runnable 接口;
2、通過繼承 Thread 類本身;
3、通過 Callable 和 Future 創(chuàng)建線程。
五、示例
1、Runnable接口
package com.zhouzy.base.t10; public class RunnableTest implements Runnable{ @Override public void run() { System.out.println("實(shí)現(xiàn)Runnable接口創(chuàng)建的線程,線程名:"+Thread.currentThread().getName()); } }
2、繼承Thread
package com.zhouzy.base.t10; public class ThreadTest extends Thread{ @Override public void run() { System.out.println("繼承Thread創(chuàng)建的線程,線程名:"+Thread.currentThread().getName()); } }
3、Callable 和 Future 創(chuàng)建線程
package com.zhouzy.base.t10; import java.util.concurrent.Callable; public class CallableTest implements Callable<String>{ @Override public String call() throws Exception { System.out.println("實(shí)現(xiàn)Callable接口創(chuàng)建的線程,線程名:"+Thread.currentThread().getName()); return "這是Callable接口返回的"; } }
4、測(cè)試
@Test public void threadTest(){ try { //Runnable接口測(cè)試 RunnableTest runnable = new RunnableTest(); Thread runThread = new Thread(runnable); runThread.setName("Runnable線程"); runThread.start(); //繼承Thread測(cè)試 ThreadTest t = new ThreadTest(); t.setName("Thread線程"); t.start(); CallableTest call = new CallableTest(); FutureTask<String> ft = new FutureTask<>(call); Thread ct = new Thread(ft); ct.setName("Callable線程"); ct.start(); System.out.println("callable線程返回值:"+ft.get()); }catch (Exception e) { e.printStackTrace(); } }
測(cè)試結(jié)果:
實(shí)現(xiàn)Runnable接口創(chuàng)建的線程,線程名:Runnable線程
繼承Thread創(chuàng)建的線程,線程名:Thread線程
實(shí)現(xiàn)Callable接口創(chuàng)建的線程,線程名:Callable線程
callable線程返回值:這是Callable接口返回的
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java抽象類、繼承及多態(tài)和適配器的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java抽象類、繼承及多態(tài)和適配器的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-06-06java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作
這篇文章主要介紹了java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09RxJava中map和flatMap的用法區(qū)別源碼解析
這篇文章主要為大家介紹了RxJava中map和flatMap的用法區(qū)別源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Java中OAuth2.0第三方授權(quán)原理與實(shí)戰(zhàn)
本文主要介紹了Java中OAuth2.0第三方授權(quán)原理與實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05Spring使用AspectJ的注解式實(shí)現(xiàn)AOP面向切面編程
這篇文章主要介紹了Spring使用AspectJ的注解式實(shí)現(xiàn)AOP面向切面編程的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06CentOS7和8中安裝Maven3.8.4的簡(jiǎn)單步驟
maven是屬于apache的一個(gè)工具,主要是對(duì)java進(jìn)行編譯打包,解決依賴關(guān)系,下面這篇文章主要給大家介紹了關(guān)于CentOS7和8中安裝Maven3.8.4的相關(guān)資料,需要的朋友可以參考下2022-04-04Javabean轉(zhuǎn)換成json字符并首字母大寫代碼實(shí)例
這篇文章主要介紹了javabean轉(zhuǎn)成json字符并首字母大寫代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02