日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

温习了一下java线程状态方面的知识总结一

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 温习了一下java线程状态方面的知识总结一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

好長時間沒有復習線程狀態這塊,讀并發編程實戰正好看著這塊,順便復習一下:

1.線程的五種狀態:

?

2.線程五種狀態的轉換圖:

  • ?wait()會立刻釋放synchronized(obj)中的鎖以便其它線程可以執行obj.notify?
  • 但是notify() 不會立即釋放synchronize(obj)中必須等nofity所在線程執行完?synchronize(obj)塊中所有代碼才能釋放這把鎖
  • Thread.sleep(long millisecond) 來掛起線程,sleep 可以給優先級低的線程執行,但是它不會釋放鎖,就是說如果有synchronizde 代碼塊其他的線程仍然不能訪問
  • Thread.yield()可以給其他線程執行的機會。如果沒有其他線程此方法沒有任何作用,于sleep() 類似就是有synchronize則同步塊其他線程仍然不能訪問共享數據。
  • 總之:參考:https://blog.csdn.net/wangpei555/article/details/61414447
    • 調用join方法后,線程阻塞,線程失去對該對象鎖的持有,失去cpu.
    • sleep方法執行后,處于阻塞狀態,線程會交出cpu,對該對象的鎖沒有交出,其他線程也無法訪問該對象。?
    • 調用yield方法會讓當前線程交出CPU權限,讓CPU去執行其他的線程。它跟sleep方法類似,同樣不會釋放鎖。

    ?3.看一個簡單的生產者和消費者的列子

    ?生產者的列子:

    package com.asiainfo.producer;public class Producer extends Thread {private CubbyHole cubbyhole;private int num;Producer(CubbyHole cubbyhole, int num) {this.cubbyhole = cubbyhole;this.num = num;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {cubbyhole.put(i);System.out.println("Producer#" + this.num + "put:" + i);}try {sleep((int) Math.random() * 100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// TODO Auto-generated method stubsuper.run();} }

    消費者:

    package com.asiainfo.producer;public class Consumer extends Thread {private CubbyHole cubbyhole;private int num;Consumer(CubbyHole cubbyhole,int num){this.cubbyhole=cubbyhole;this.num=num;}@Overridepublic void run() {// TODO Auto-generated method stubint value=0;for(int i=0;i<10;i++){value=cubbyhole.get();System.out.println("Cusumber#"+this.num+"got"+value);}super.run();}}

    共享的對象:

    像CubbyHole 這樣被多個線程同步線程共享的對象稱為條件遍歷;這里的條件變量就相當于一個監視器,java語言就是通過監視器來實現同步的一個monitor 就相當于一個只能容納一個線程的小盒子,在一點特定的時間里只能容納一個線程進入monitor,而其他線程將被暫停知道當前線程離開這個盒子。

    package com.asiainfo.producer;public class CubbyHole {private int seq;public synchronized int get() {return seq;}public synchronized void put(int seq) {this.seq = seq;}}

    測試類:

    package com.asiainfo.producer;public class Person {public static void main(String[] args) {CubbyHole cubbyHole = new CubbyHole();Consumer consumer = new Consumer(cubbyHole,1);Producer producer = new Producer(cubbyHole,2);producer.start();consumer.start();}}

    產生的結果:

    由于線程中不能保證,當producer 生產一個數據,就會被consumer 消費,有可能存在,競爭鎖過程中,消費者,快于生產者,或者是生產者 快于消費者的狀態,但是這兩種狀況都不是我們想要的;

    改進后的CUbberHole 類;

    package com.asiainfo.producer;public class CubbyHole {private int seq;//改進private boolean available =false;public synchronized int get() {while(available==false){try {/*** wait()會立刻釋放synchronized(obj)中的鎖以便其它線程可以執行obj.notify*/wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}available=false;/*** 但是notify() 不會立即釋放synchronize(obj)中必須等nofity所在線程執行完 * synchronize(obj)塊中所有代碼才能釋放這把鎖*/notify();return seq;}public synchronized void put(int value) {while(available==true){try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}seq=value;available=true;notify();}}

    執行結果:

    ?

    總結

    以上是生活随笔為你收集整理的温习了一下java线程状态方面的知识总结一的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。