最近中文字幕国语免费完整,中文亚洲无线码49vv,中文无码热在线视频,亚洲自偷自拍熟女另类,中文字幕高清av在线

當(dāng)前位置: 首頁(yè) > 技術(shù)教程

Java 多線程怎么創(chuàng)建? 線程同步用什么關(guān)鍵字?

  多線程是Java實(shí)現(xiàn)并發(fā)執(zhí)行的核心機(jī)制,它允許程序同時(shí)運(yùn)行多個(gè)獨(dú)立的執(zhí)行流(線程),從而提高 CPU 利用率,適用于需要處理多個(gè)任務(wù)的場(chǎng)景(如網(wǎng)絡(luò)請(qǐng)求處理、數(shù)據(jù)并行計(jì)算等)。多線程共享資源時(shí)可能出現(xiàn)數(shù)據(jù)不一致問題,線程同步技術(shù)正是解決這一問題的關(guān)鍵。了解多線程的創(chuàng)建方法和同步關(guān)鍵字的使用,是掌握并發(fā)編程的基礎(chǔ)。

  一、Java 多線程的創(chuàng)建方法

  Java 中創(chuàng)建線程主要有三種方式:繼承Thread類、實(shí)現(xiàn)Runnable接口、實(shí)現(xiàn)Callable接口(帶返回值),其中前兩種最為常用。

  (一)繼承 Thread 類

  Thread類是 Java 線程的基礎(chǔ)類,繼承該類并重寫run()方法即可定義線程任務(wù),通過start()方法啟動(dòng)線程(而非直接調(diào)用run())。

  示例:

  // 自定義線程類class MyThread extends Thread { @Override public void run() { // 線程執(zhí)行的任務(wù) for (int i = 0; i < 5; i++) { System.out.println("線程" + Thread.currentThread().getName() + ":" + i); } }}// 測(cè)試public class ThreadTest { public static void main(String[] args) { MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); thread1.setName("Thread-1"); thread2.setName("Thread-2"); thread1.start(); // 啟動(dòng)線程1 thread2.start(); // 啟動(dòng)線程2 }}

  特點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,但因 Java 單繼承限制,該類無(wú)法再繼承其他類,靈活性較低。

  (二)實(shí)現(xiàn) Runnable 接口

  Runnable接口僅定義了run()方法,實(shí)現(xiàn)該接口并重寫方法后,需將實(shí)例傳入Thread類的構(gòu)造方法啟動(dòng)線程。

  示例:

  // 實(shí)現(xiàn)Runnable接口class MyRunnable implements Runnable { @Override public void run() { // 線程執(zhí)行的任務(wù) for (int i = 0; i < 5; i++) { System.out.println("線程" + Thread.currentThread().getName() + ":" + i); } }}// 測(cè)試public class RunnableTest { public static void main(String[] args) { MyRunnable task = new MyRunnable(); Thread thread1 = new Thread(task, "Thread-1"); Thread thread2 = new Thread(task, "Thread-2"); thread1.start(); thread2.start(); }}

  特點(diǎn):避免單繼承限制,多個(gè)線程可共享同一個(gè)Runnable實(shí)例(適合多線程共享資源場(chǎng)景),是更推薦的方式。

  (三)實(shí)現(xiàn) Callable 接口(帶返回值)

  Callable接口與Runnable類似,但call()方法可返回結(jié)果并拋出異常,需結(jié)合FutureTask類獲取返回值。

  示例:

  import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;// 實(shí)現(xiàn)Callable接口class MyCallable implements Callable<Integer> { @Override public Integer call() throws Exception { int sum = 0; for (int i = 1; i <= 10; i++) { sum += i; } return sum; // 返回計(jì)算結(jié)果 }}// 測(cè)試public class CallableTest { public static void main(String[] args) throws Exception { MyCallable task = new MyCallable(); FutureTask<Integer> futureTask = new FutureTask<>(task); Thread thread = new Thread(futureTask); thread.start(); System.out.println("計(jì)算結(jié)果:" + futureTask.get()); // 獲取返回值 }}

  特點(diǎn):適合需要線程返回結(jié)果的場(chǎng)景(如并行計(jì)算),但實(shí)現(xiàn)稍復(fù)雜。

java3.jpg

  二、線程同步的關(guān)鍵字:synchronized

  多線程共享資源時(shí),若多個(gè)線程同時(shí)修改資源,可能導(dǎo)致數(shù)據(jù)錯(cuò)誤(如銀行賬戶并發(fā)取款)。synchronized關(guān)鍵字是 Java 中最基礎(chǔ)的線程同步機(jī)制,通過加鎖保證同一時(shí)間只有一個(gè)線程執(zhí)行特定代碼塊,從而保護(hù)共享資源。

  (一)synchronized 的使用方式

  修飾方法:鎖住當(dāng)前對(duì)象實(shí)例(非靜態(tài)方法)或類(靜態(tài)方法)。

  class Counter { private int count = 0; // 非靜態(tài)同步方法:鎖住當(dāng)前Counter實(shí)例 public synchronized void increment() { count++; } // 靜態(tài)同步方法:鎖住Counter類 public static synchronized void staticMethod() { // 靜態(tài)資源操作 }}

  修飾代碼塊:鎖住指定對(duì)象(更靈活,可減少鎖范圍)。

  class Counter { private int count = 0; private Object lock = new Object(); // 自定義鎖對(duì)象 public void increment() { // 同步代碼塊:鎖住lock對(duì)象 synchronized (lock) { count++; } }}

  (二)同步原理

  synchronized通過對(duì)象監(jiān)視器(Monitor) 實(shí)現(xiàn)鎖機(jī)制:

  線程進(jìn)入同步代碼前需獲取鎖,執(zhí)行完畢后釋放鎖;

  若鎖被其他線程占用,當(dāng)前線程會(huì)進(jìn)入阻塞狀態(tài),直至鎖釋放。

  這種機(jī)制保證了同步代碼塊的原子性(不可分割),避免多線程并發(fā)修改導(dǎo)致的數(shù)據(jù)不一致。

  (三)適用場(chǎng)景

  多線程共享簡(jiǎn)單資源(如計(jì)數(shù)器、共享變量);

  對(duì)同步性能要求不極致的場(chǎng)景(synchronized在 JDK 1.6 后經(jīng)過優(yōu)化,性能已大幅提升)。

  示例:解決并發(fā)計(jì)數(shù)問題

  // 未同步的計(jì)數(shù)器(存在問題)class UnsafeCounter { private int count = 0; public void increment() { count++; } public int getCount() { return count; }}// 同步的計(jì)數(shù)器(正確)class SafeCounter { private int count = 0; public synchronized void increment() { count++; } public int getCount() { return count; }}// 測(cè)試public class SyncTest { public static void main(String[] args) throws InterruptedException { SafeCounter counter = new SafeCounter(); // 10個(gè)線程同時(shí)遞增 for (int i = 0; i < 10; i++) { new Thread(() -> { for (int j = 0; j < 1000; j++) { counter.increment(); } }).start(); } Thread.sleep(1000); // 等待所有線程執(zhí)行完畢 System.out.println("最終計(jì)數(shù):" + counter.getCount()); // 輸出10000(正確) }}

  三、使用多線程的注意事項(xiàng)

  避免過度同步:同步范圍過大(如同步整個(gè)方法)會(huì)導(dǎo)致線程阻塞時(shí)間長(zhǎng),降低并發(fā)效率,應(yīng)盡量縮小同步代碼塊范圍。

  防止死鎖:多線程持有多個(gè)鎖時(shí),若獲取順序不一致可能導(dǎo)致死鎖(如線程 1 持有鎖 A 等待鎖 B,線程 2 持有鎖 B 等待鎖 A),需保證鎖的獲取順序一致。

  線程池優(yōu)先:頻繁創(chuàng)建和銷毀線程會(huì)消耗資源,實(shí)際開發(fā)中建議使用線程池(如ExecutorService)管理線程生命周期。

  Java 多線程的創(chuàng)建可根據(jù)需求選擇繼承Thread、實(shí)現(xiàn)Runnable或Callable,其中Runnable因靈活性更常用;synchronized關(guān)鍵字是實(shí)現(xiàn)線程同步的基礎(chǔ),通過加鎖機(jī)制保護(hù)共享資源。掌握這些知識(shí),能幫助開發(fā)者應(yīng)對(duì)簡(jiǎn)單的并發(fā)場(chǎng)景,為學(xué)習(xí)更高級(jí)的并發(fā)工具(如Lock、Atomic類)奠定基礎(chǔ)。

 


猜你喜歡