最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java多線程基礎(chǔ)

 更新時間:2026年05月27日 10:03:31   作者:愛滑雪的碼農(nóng)  
這篇文章給大家介紹了Java多線程基礎(chǔ)知識,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

線程創(chuàng)建兩種方式

方式 1:繼承 Thread 類

繼承后重寫run(),調(diào)用start()啟動線程

// 1.定義線程類
class MyThread extends Thread{
    @Override
    public void run() {
        // 線程執(zhí)行任務(wù)
        for (int i = 0; i < 5; i++) {
            System.out.println("線程執(zhí)行:"+i);
        }
    }
}
// 測試
public class ThreadDemo {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start(); // 啟動線程,自動執(zhí)行run方法
    }
}

方式 2:實現(xiàn) Runnable 接口

避免單繼承限制,更常用

// 1.實現(xiàn)接口
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("任務(wù)運行:"+i);
        }
    }
}
public class RunnableDemo {
    public static void main(String[] args) {
        MyRunnable task = new MyRunnable();
        Thread t2 = new Thread(task);
        t2.start();
    }
}

如何實現(xiàn)多線程

// 1.定義線程類
class MyThread extends Thread{
    @Override
    public void run() {
        // 線程執(zhí)行任務(wù)
        for (int i = 0; i < 5; i++) {
            // 加上當(dāng)前線程名字,你能看清誰在跑
            System.out.println(getName() + " 執(zhí)行:"+i);
        }
    }
}
// 測試
public class ThreadDemo {
    public static void main(String[] args) {
        // 創(chuàng)建 2 個線程
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        // 給線程起名字
        t1.setName("線程A");
        t2.setName("線程B");
        // 啟動 → 這才是多線程!
        t1.start();
        t2.start();
    }
}
// 1. 定義任務(wù)(不是線程,是任務(wù))
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            // 打印當(dāng)前線程名字,能看清誰在跑
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}
public class RunnableDemo {
    public static void main(String[] args) {
        // 1. 創(chuàng)建任務(wù)
        MyRunnable task = new MyRunnable();
        // 2. 創(chuàng)建 2 個線程,執(zhí)行同一個任務(wù)?。。?
        Thread t1 = new Thread(task, "線程1");
        Thread t2 = new Thread(task, "線程2");
        // 3. 啟動兩個線程 → 這就是多線程!
        t1.start();
        t2.start();
    }
}

線程生命周期

新建new線程對象-調(diào)用start(),等待CPU調(diào)度-CPU執(zhí)行run方法-sleep,等待鎖,IO阻塞-任務(wù)執(zhí)行完畢/異常終止

sleep 線程休眠

讓線程暫停指定毫秒,讓出 CPU 執(zhí)行權(quán)

class SleepThread implements Runnable{
    @Override
    public void run() {
        for (int i = 1; i <= 3; i++) {
            System.out.println("計數(shù):"+i);
            try {
                // 休眠1000毫秒=1秒
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class SleepTest {
    public static void main(String[] args) {
        new Thread(new SleepThread()).start();
    }
}

線程安全問題 & synchronized 同步鎖

多線程同時操作共享數(shù)據(jù),會出現(xiàn)數(shù)據(jù)錯亂,加鎖保證同一時間僅一個線程訪問

//無鎖不安全示例
class Ticket implements Runnable{
    private int ticket = 10;
    @Override
    public void run() {
        while (ticket > 0){
            System.out.println("剩余票數(shù):"+ticket--);
        }
    }
}
// 多線程搶票,會出現(xiàn)重復(fù)票數(shù)、負(fù)數(shù)票
public class UnSafeTest {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(ticket,"窗口1").start();
        new Thread(ticket,"窗口2").start();
    }
}
//synchronized 加鎖解決安全問題
class SafeTicket implements Runnable{
    private int ticket = 10;
    // 鎖對象
    private final Object lock = new Object();
    @Override
    public void run() {
        while (true){
            // 同步代碼塊,同一時間只允許一個線程進(jìn)入
            synchronized (lock){
                if(ticket <= 0){
                    break;
                }
                System.out.println(Thread.currentThread().getName()+"出票,剩余:"+ticket--);
            }
        }
    }
}
public class SafeLockTest {
    public static void main(String[] args) {
        SafeTicket ticket = new SafeTicket();
        new Thread(ticket,"窗口A").start();
        new Thread(ticket,"窗口B").start();
    }
}

HashMap vs 線程安全集合

  • HashMap:線程不安全,多線程下會出錯、數(shù)據(jù)丟失、死循環(huán)。
  • 線程安全集合:多線程下不會出錯,保證數(shù)據(jù)正確。

HashMap 為什么線程不安全?

原因:

  • 沒有加鎖
  • 多線程同時修改、插入數(shù)據(jù)時,會互相覆蓋、沖突
  • JDK 1.8 之前會造成死循環(huán)

多線程使用 HashMap 會出現(xiàn)什么問題?

  • 數(shù)據(jù)覆蓋
  • 數(shù)據(jù)丟失
  • 并發(fā)修改異常
  • 極端情況下鏈表成環(huán)(卡死)

Java 提供哪些線程安全的 Map?

  • Hashtable(古老,效率低)
  • Collections.synchronizedMap(Map)(包裝成安全 map)
  • ConcurrentHashMap推薦!最常用!高性能!

1)HashMap(線程不安全)

單線程用,多線程絕對不能用!

Map<String, String> map = new HashMap<>();

2)Hashtable(線程安全,但性能差)

  • 方法全部加 synchronized
  • 多線程會串行等待,性能差
  • 現(xiàn)在基本不用
Map<String, String> map = new Hashtable<>();

3)Collections.synchronizedMap(安全,性能一般)

把不安全的 Map 包裝成安全的

Map<String, String> map = Collections.synchronizedMap(new HashMap<>());

4)ConcurrentHashMap(企業(yè)級首選!

  • Java 最推薦的線程安全 Map
  • 分段鎖 / CAS 機(jī)制,高并發(fā)、高性能
  • 多線程開發(fā)必須用它
Map<String, String> map = new ConcurrentHashMap<>();

到此這篇關(guān)于Java多線程基礎(chǔ)的文章就介紹到這了,更多相關(guān)java多線程基礎(chǔ)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景

    淺談Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景

    這篇文章主要介紹了Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java線程代碼的實現(xiàn)方法

    Java線程代碼的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狫ava線程代碼的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • java實現(xiàn)解析json復(fù)雜數(shù)據(jù)的第三種思路詳解

    java實現(xiàn)解析json復(fù)雜數(shù)據(jù)的第三種思路詳解

    這篇文章主要為大家信息介紹了java實現(xiàn)解析json復(fù)雜數(shù)據(jù)的第三種思路,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Spring?Boot?整合?SSE(Server-Sent?Events)實戰(zhàn)案例(全網(wǎng)最全)

    Spring?Boot?整合?SSE(Server-Sent?Events)實戰(zhàn)案例(全網(wǎng)最全)

    本文通過實戰(zhàn)案例講解SpringBoot整合SSE技術(shù),涵蓋實現(xiàn)原理、代碼配置、異常處理及前端交互,討論與WebSocket對比、分布式解決方案、性能監(jiān)控,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • idea項目打開后出現(xiàn)橙色的時鐘圖標(biāo)的解決

    idea項目打開后出現(xiàn)橙色的時鐘圖標(biāo)的解決

    本文主要介紹了idea項目打開后出現(xiàn)橙色的時鐘圖標(biāo)的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 解決?IDEA?Maven?項目中"Could?not?find?artifact"?問題的常見情況和解決方案

    解決?IDEA?Maven?項目中"Could?not?find?artifact"?

    這篇文章主要介紹了解決IDEA Maven項目中Could not?find?artifact問題的常見情況和解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java內(nèi)部類和異常類的概念以及使用

    Java內(nèi)部類和異常類的概念以及使用

    這篇文章主要介紹了Java內(nèi)部類和異常類的概念以及使用,文中有非常詳細(xì)的代碼以及注釋,適合正在學(xué)習(xí)java基礎(chǔ)的同學(xué)們使用,需要的朋友可以參考下
    2021-04-04
  • Java實現(xiàn)數(shù)據(jù)連接池Druid舉例

    Java實現(xiàn)數(shù)據(jù)連接池Druid舉例

    本文主要介紹了Java實現(xiàn)數(shù)據(jù)連接池Druid舉例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java函數(shù)式編程(七):MapReduce

    Java函數(shù)式編程(七):MapReduce

    這篇文章主要介紹了Java函數(shù)式編程(七):MapReduce,本文是系列文章的第7篇,其它文章請參閱本文底部的相關(guān)文章,需要的朋友可以參考下
    2014-09-09
  • spring cloud 之 Feign 使用HTTP請求遠(yuǎn)程服務(wù)的實現(xiàn)方法

    spring cloud 之 Feign 使用HTTP請求遠(yuǎn)程服務(wù)的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猻pring cloud 之 Feign 使用HTTP請求遠(yuǎn)程服務(wù)的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06

最新評論

四会市| 石城县| 五大连池市| 罗定市| 庆阳市| 肇源县| 西藏| 沂源县| 凤冈县| 枞阳县| 东明县| 华安县| 德格县| 温泉县| 梅河口市| 陈巴尔虎旗| 鄄城县| 太保市| 宜兰市| 衡阳市| 阿鲁科尔沁旗| 阳山县| 宁远县| 如东县| 调兵山市| 包头市| 芦溪县| 大兴区| 通城县| 临沂市| 云林县| 兴城市| 合山市| 沐川县| 抚顺市| 嵊州市| 固镇县| 顺义区| 班戈县| 淮滨县| 伊金霍洛旗|