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