一、線程概述
線程是操作系統能夠進行運算調度的最小單位,它被包含於進程中,與同一進程中的其他線程共享進程的內存和其他資源,是並發編程的重要概念。
Java 中的每個線程都是一個線程對象,都實現了 Runnable 接口中的 run() 方法。線程的創建、啟動和運行將分別介紹如下。
二、創建線程的三種方式
1. 繼承 Thread 類
通過繼承 Thread 類來創建線程,需要重寫 run() 方法並在其中定義線程代碼。然後創建該類對象並調用 start() 方法啟動線程。
class MyThread extends Thread { public void run() { // 線程代碼 } } MyThread myThread = new MyThread(); myThread.start();
2. 實現 Runnable 接口
通過實現 Runnable 接口來創建線程,同樣需要實現 run() 方法,並在其中定義線程代碼。然後創建 Thread 類對象並把 Runnable 對象作為構造方法的參數傳入,然後調用 start() 方法啟動線程。
class MyRunnable implements Runnable { public void run() { // 線程代碼 } } MyRunnable myRunnable = new MyRunnable(); Thread myThread = new Thread(myRunnable); myThread.start();
3. 實現 Callable 接口
Callable 接口通過 call() 方法使得線程可以返回執行結果,並且可以通過 Future 接口獲取線程返回結果。
class MyCallable implements Callable { public String call() throws Exception { // 線程代碼 return "線程執行結果"; } } MyCallable myCallable = new MyCallable(); FutureTask result = new FutureTask(myCallable); Thread myThread = new Thread(result); myThread.start(); String threadResult = result.get(); // 獲取線程執行結果
三、線程的常用方法
1. sleep()
sleep() 方法使當前線程暫停指定的時間(毫秒),通過該方法可以實現線程的延遲執行。
try { Thread.sleep(1000); // 線程睡眠 1 秒 } catch (InterruptedException e) { e.printStackTrace(); }
2. join()
join() 方法使當前線程等待另一個線程結束,通過該方法可以控制線程的執行順序。
Thread myThread = new Thread(new MyRunnable()); myThread.start(); try { myThread.join(); // 等待 myThread 線程執行結束 } catch (InterruptedException e) { e.printStackTrace(); }
3. yield()
yield() 方法使當前線程讓出 CPU 控制權,暫停當前線程並使其它線程有機會繼續執行。
Thread.yield();
4. setPriority()
setPriority() 方法設置線程的優先級,優先級高的線程被系統調度的概率更高。
Thread myThread = new Thread(new MyRunnable()); myThread.setPriority(Thread.MAX_PRIORITY); // 將 myThread 線程優先級設置為最高 myThread.start();
5. interrupt()
interrupt() 方法中斷線程運行,拋出 InterruptedException 異常。
Thread myThread = new Thread(new MyRunnable()); myThread.start(); myThread.interrupt(); // 中斷 myThread 線程運行
四、線程的同步控制
1. synchronized
synchronized 關鍵字可以實現線程的同步控制,通過 synchronized 關鍵字給代碼段加鎖,使得多個線程不能同時執行同一個代碼段。
class SyncDemo { synchronized void printNum() { for (int i = 1; i syncDemo.printNum()); Thread thread2 = new Thread(() -> syncDemo.printNum()); thread1.start(); thread2.start();
2. lock
Lock 接口是從 JDK5 引入的一種新的同步機制,它提供與 synchronized 關鍵字相同的同步功能,但相比 synchronized 關鍵字更靈活、更安全、性能更優。
Lock lock = new ReentrantLock(); class LockDemo { void printNum() { lock.lock(); for (int i = 1; i lockDemo.printNum()); Thread thread2 = new Thread(() -> lockDemo.printNum()); thread1.start(); thread2.start();
五、總結
本文從線程概述、創建線程的三種方式、線程的常用方法、線程的同步控制四個方面詳細介紹了 Java 創建線程的相關知識點,並給出了代碼實現。掌握了本文所講的知識點,才能更好地進行 Java 並發編程。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/237210.html