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

Java使用wait/notify實現線程間通信下篇

 更新時間:2022年12月12日 15:45:25   作者:愛吃南瓜糕的北絡  
wait()和notify()是直接隸屬于Object類,也就是說所有對象都擁有這一對方法,下面這篇文章主要給大家介紹了關于使用wait/notify實現線程間通信的相關資料,需要的朋友可以參考下

上一節(jié)針對wait/notify實現線程間通信的基本概念做了講解(Java使用wait/notify實現線程間通信上篇),本節(jié)繼續(xù)針對wait/notify實現線程間通信的其他知識點及特性進行講解。

1. 當 interrupt() 方法遇到 wait() 方法

當線程調用鎖對象的wait() 方法使線程呈等待狀態(tài)時,調用線程對象的 interrupt() 方法會出現 InterruptedException 異常。

public class ThreadC7 {
    @Test
    public void test1() {
        try {
            Object obj = new Object();
            ThreadC7A threadC7A = new ThreadC7A(obj);
            threadC7A.start();
            Thread.sleep(2000);
            threadC7A.interrupt();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class ServiceC7 {
    public void testMethod(Object obj) {
        try {
            synchronized (obj) {
                System.out.println("begin wait");
                obj.wait();
                System.out.println("begin end");
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("出現異常了,wait狀態(tài)的線程被interrupt了!");
        }
    }
}
class ThreadC7A extends Thread {
    private Object obj;
    public ThreadC7A(Object obj) {
        this.obj = obj;
    }
    @Override
    public void run() {
        ServiceC7 serviceC7 = new ServiceC7();
        serviceC7.testMethod(obj);
    }
}

執(zhí)行結果:

2. notify() 只通知一個線程

調用方法notify()一次只隨機通知一個線程進行喚醒。

public class ThreadC8 {
    @Test
    public void test() {
        Object obj = new Object();
        ThreadC8A threadC8A = new ThreadC8A(obj);
        threadC8A.setName("threadC8A");
        threadC8A.start();
        ThreadC8B threadC8B = new ThreadC8B(obj);
        threadC8B.setName("threadC8B");
        threadC8B.start();
        ThreadC8C threadC8C = new ThreadC8C(obj);
        threadC8C.setName("threadC8C");
        threadC8C.start();
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        synchronized (obj) {
            obj.notify();
        }
        while (Thread.activeCount() > 1) {
        }
    }
}
class ServiceC8 {
    public void service(Object obj) {
        try {
            synchronized (obj) {
                String threadName = Thread.currentThread().getName();
                System.out.println("begin wait,Thread Name:[" + threadName + "]");
                obj.wait();
                System.out.println("end wait,Thread Name:[" + threadName + "]");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class ThreadC8A extends Thread {
    private Object obj;
    public ThreadC8A(Object obj) {
        this.obj = obj;
    }
    @Override
    public void run() {
        ServiceC8 serviceC8 = new ServiceC8();
        serviceC8.service(obj);
    }
}
class ThreadC8B extends Thread {
    private Object obj;
    public ThreadC8B(Object obj) {
        this.obj = obj;
    }
    @Override
    public void run() {
        ServiceC8 serviceC8 = new ServiceC8();
        serviceC8.service(obj);
    }
}
class ThreadC8C extends Thread {
    private Object obj;
    public ThreadC8C(Object obj) {
        this.obj = obj;
    }
    @Override
    public void run() {
        ServiceC8 serviceC8 = new ServiceC8();
        serviceC8.service(obj);
    }
}

執(zhí)行結果:

程序運行的效果如圖所示,可以看出方法notify()僅隨機喚醒一個線程。

當多次調用notify()方法時,會隨機將等待wait狀態(tài)的線程進行喚醒。更改代碼如下:

再次運行,程序運行效果如圖所示,可以看出所有的線程全部被喚醒。

多次調用notify()方法可喚醒全部WAITING中的線程。

3. notifyAll() 喚醒所有線程

前面的示例中通過多次調用 notify() 方法來實現喚醒3個線程,但并不能保證系統(tǒng)中僅有3個線程,也就是若notify()方法的調用次數小于線程對象的數量,會出現有部分線程對象無法被喚醒的情況。為了喚醒全部線程,可以使用notifyAll()方法。

更改代碼如下:

再次運行,程序運行效果如圖所示,可以看出所有的線程全部被喚醒。

4. 方法 wait(long)的使用

帶一個參數的wait(long) 方法的功能是等待某一時間內是否有現成對鎖進行喚醒,如果超過這個時間則自動喚醒。

public class ThreadC9 {
    @Test
    public void test() {
        Object obj = new Object();
        ThreadC9A threadC9A = new ThreadC9A(obj);
        threadC9A.start();
        while (Thread.activeCount() > 1) {
        }
    }
}
class ThreadC9A extends Thread {
    private Object obj;
    public ThreadC9A(Object obj) {
        this.obj = obj;
    }
    @Override
    public void run() {
        try {
            synchronized (obj) {
                long startTime = System.currentTimeMillis();
                System.out.println("begin wait,time:[" + startTime + "]");
                obj.wait(5000);
                long endTime = System.currentTimeMillis();
                System.out.println("end wait,time:[" + endTime + "] takes " + (endTime - startTime) + " ms");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

執(zhí)行結果:

通過執(zhí)行結果可以看出,在經過5000ms后,線程被喚醒。

到此這篇關于Java使用wait/notify實現線程間通信下篇的文章就介紹到這了,更多相關Java wait notify內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于Spring?Cloud的熔斷器監(jiān)控問題

    關于Spring?Cloud的熔斷器監(jiān)控問題

    Turbine是一個聚合Hystrix監(jiān)控數據的工具,它可將所有相關/hystrix.stream端點的數據聚合到一個組合的/turbine.stream中,從而讓集群的監(jiān)控更加方便,接下來通過本文給大家介紹Spring?Cloud的熔斷器監(jiān)控,感興趣的朋友一起看看吧
    2022-01-01
  • Java Volatile關鍵字你真的了解嗎

    Java Volatile關鍵字你真的了解嗎

    這篇文章主要為大家介紹了Java Volatile關鍵字,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Java中ArrayList類的使用方法

    Java中ArrayList類的使用方法

    ArrayList就是傳說中的動態(tài)數組,用MSDN中的說法,就是Array的復雜版本,下面來簡單介紹下
    2013-12-12
  • Spring Boot集成教程之異步調用Async

    Spring Boot集成教程之異步調用Async

    在項目中,當訪問其他人的接口較慢或者做耗時任務時,不想程序一直卡在耗時任務上,想程序能夠并行執(zhí)行,我們可以使用多線程來并行的處理任務,也可以使用spring提供的異步處理方式@Async。需要的朋友們下面來一起看看吧。
    2018-03-03
  • Java Socket編程(三) 服務器Sockets

    Java Socket編程(三) 服務器Sockets

    Java Socket編程(三) 服務器Sockets...
    2006-12-12
  • Spring中的@RestController注解詳細解析

    Spring中的@RestController注解詳細解析

    這篇文章主要介紹了Spring中的@RestController注解詳細解析,@RestController 是 Spring Framework 中的一個注解,用于標識一個類為 RESTful Web 服務的控制器(Controller),處理 HTTP 請求并返回相應的數據,
    2024-01-01
  • Spring Boot實現簡單的增刪改查

    Spring Boot實現簡單的增刪改查

    這篇文章主要介紹了Spring Boot如何實現簡單的增刪改查,幫助大家更好的理解和學習spring boot框架,感興趣的朋友可以了解下
    2020-09-09
  • MyBatis方法重載的陷阱及解決方案

    MyBatis方法重載的陷阱及解決方案

    在使用 MyBatis 進行開發(fā)時,尤其是使用注解模式(如 @Select、@Insert 等)時,開發(fā)者常常會遇到這樣一個問題:為什么我的方法重載不能正常工作?這篇文章將深入探討 MyBatis 的這個特性及如何規(guī)避相關的坑,需要的朋友可以參考下
    2024-09-09
  • Spring中的ConversionService源碼解析

    Spring中的ConversionService源碼解析

    這篇文章主要介紹了Spring中的ConversionService源碼解析,ConversionService是類型轉換服務的接口,從名字就可以看出ConverterRegistry是要實現轉換器注冊表的接口,添加和移除Converter和GenericConverter,需要的朋友可以參考下
    2023-11-11
  • Spring Boot集成Mybatis的實例代碼(簡潔版)

    Spring Boot集成Mybatis的實例代碼(簡潔版)

    這篇文章主要介紹了Spring Boot集成Mybatis簡潔版的教程,需要的朋友可以參考下
    2018-02-02

最新評論

关岭| 周至县| 泰顺县| 乌拉特中旗| 曲阜市| 和龙市| 呼伦贝尔市| 体育| 馆陶县| 万盛区| 大城县| 庆安县| 汨罗市| 阿瓦提县| 隆回县| 海南省| 绥德县| 桓仁| 镇安县| 秦安县| 沙湾县| 镇康县| 永川市| 永春县| 南京市| 晋中市| 谢通门县| 咸阳市| 石城县| 津南区| 车险| 阿鲁科尔沁旗| 无为县| 江源县| 新竹县| 攀枝花市| 信丰县| 石林| 扶沟县| 镇原县| 都昌县|