一篇文章帶你入門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的更多內容!

推薦閱讀: