一篇文章帶你入門java多線程
一、描述
Java 給多線程編程提供瞭內置的支持。 一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。
多線程是多任務的一種特別的形式,但多線程使用瞭更小的資源開銷。
這裡定義和線程相關的另一個術語 – 進程:一個進程包括由操作系統分配的內存空間,包含一個或多個線程。一個線程不能獨立的存在,它必須是進程的一部分。一個進程一直運行,直到所有的非守護線程都結束運行後才能結束。
多線程能滿足程序員編寫高效率的程序來達到充分利用 CPU 的目的。
二、一個線程的生命周期
1. 初始(NEW):新創建瞭一個線程對象,但還沒有調用start()方法。
2. 運行(RUNNABLE):Java線程中將就緒(ready)和運行中(running)兩種狀態籠統的稱為“運行”。
線程對象創建後,其他線程(比如main線程)調用瞭該對象的start()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲取CPU的使用權,此時處於就緒狀態(ready)。就緒狀態的線程在獲得CPU時間片後變為運行中狀態(running)。
3. 阻塞(BLOCKED):表示線程阻塞於鎖。
4. 等待(WAITING):進入該狀態的線程需要等待其他線程做出一些特定動作(通知或中斷)。
5. 超時等待(TIMED_WAITING):該狀態不同於WAITING,它可以在指定的時間後自行返回。
6. 終止(TERMINATED):表示該線程已經執行完畢。
三、線程的優先級
每一個 Java 線程都有一個優先級,這樣有助於操作系統確定線程的調度順序。
Java 線程的優先級是一個整數,其取值范圍是 1 (Thread.MIN_PRIORITY ) – 10 (Thread.MAX_PRIORITY )。
默認情況下,每一個線程都會分配一個優先級 NORM_PRIORITY(5)。
具有較高優先級的線程對程序更重要,並且應該在低優先級的線程之前分配處理器資源。但是,線程優先級不能保證線程執行的順序,而且非常依賴於平臺。
四、創建線程
Java 提供瞭三種創建線程的方法:
1、通過實現 Runnable 接口;
2、通過繼承 Thread 類本身;
3、通過 Callable 和 Future 創建線程。
五、示例
1、Runnable接口
package com.zhouzy.base.t10; public class RunnableTest implements Runnable{ @Override public void run() { System.out.println("實現Runnable接口創建的線程,線程名:"+Thread.currentThread().getName()); } }
2、繼承Thread
package com.zhouzy.base.t10; public class ThreadTest extends Thread{ @Override public void run() { System.out.println("繼承Thread創建的線程,線程名:"+Thread.currentThread().getName()); } }
3、Callable 和 Future 創建線程
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("實現Callable接口創建的線程,線程名:"+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(); } }
測試結果:
實現Runnable接口創建的線程,線程名:Runnable線程
繼承Thread創建的線程,線程名:Thread線程
實現Callable接口創建的線程,線程名:Callable線程
callable線程返回值:這是Callable接口返回的
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- Java線程的三種創建方式
- Java使用Runnable和Callable實現多線程的區別詳解
- Java創建線程及配合使用Lambda方式
- Java中Thread和Runnable創建線程的方式對比
- Java十分鐘入門多線程上篇