温习了一下java线程状态方面的知识总结一
生活随笔
收集整理的這篇文章主要介紹了
温习了一下java线程状态方面的知识总结一
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
好長時間沒有復習線程狀態這塊,讀并發編程實戰正好看著這塊,順便復習一下:
1.線程的五種狀態:
?
2.線程五種狀態的轉換圖:
- 調用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线程状态方面的知识总结一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 数组移除_2020前端面试--常见
- 下一篇: c++分治法求最大最小值实现_程序员:算