熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java 線程的幾種狀態

2013-11-23 19:49:36  來源: Java高級技術 
線程有四種狀態任何一個線程肯定處於這四種狀態中的一種
  
  ) 產生(New)線程對象已經產生但尚未被啟動所以無法執行如通過new產生了一個線程對象後沒對它調用start()函數之前
  
  ) 可執行(Runnable)每個支持多線程的系統都有一個排程器排程器會從線程池中選擇一個線程並啟動它當一個線程處於可執行狀態時表示它可能正處於線程池中等待排排程器啟動它也可能它已正在執行如執行了一個線程對象的start()方法後線程就處於可執行狀態但顯而易見的是此時線程不一定正在執行中
  
  ) 死亡(Dead)當一個線程正常結束它便處於死亡狀態如一個線程的run()函數執行完畢後線程就進入死亡狀態
  
  ) 停滯(Blocked)當一個線程處於停滯狀態時系統排程器就會忽略它不對它進行排程當處於停滯狀態的線程重新回到可執行狀態時它有可能重新執行如通過對一個線程調用wait()函數後線程就進入停滯狀態只有當兩次對該線程調用notify或notifyAll後它才能兩次回到可執行狀態 class Object下常用的線程函數
  
  wait()notify()和notifyAll()這三個函數由javalangObject類提供用於協調多個線程對共享數據的存取
  
  ) wait()函數有兩種形式第一種形式接受一個毫秒值用於在指定時間長度內暫停線程使線程進入停滯狀態第二種形式為不帶參數代表waite()在notify()或notifyAll()之前會持續停滯
  
  ) 當對一個對象執行notify()時會從線程等待池中移走該任意一個線程並把它放到鎖標志等待池中當對一個對象執行notifyAll()時會從線程等待池中移走所有該對象的所有線程並把它們放到鎖標志等待池中
  
  ) 當調用wait()後線程會釋放掉它所占有的鎖標志從而使線程所在對象中的其它synchronized數據可被別的線程使用
  
  例
  
  下面我們將對例中的例子進行修改
  
  class TestThreadMethod extends Thread{
  
  public static int shareVar = ;
  
  public TestThreadMethod(String name){
  
  super(name)
  
  }
  
  public synchronized void run(){
  
  if(shareVar==){
  
  for(int i=; i<; i++){
  
  shareVar++;
  
  if(shareVar==){
  
  try{
  
  thiswait() //(
  
  }
  
  catch(InterruptedException e){}
  
  }
  
  }
  
  }
  
  if(shareVar!=){
  
  Systemoutprint(ThreadcurrentThread()getName())
  
  Systemoutprintln( shareVar = + shareVar)
  
  thisnotify() //(
  
  }
  
  }
  
  }
  
  public class TestThread{
  
  public static void main(String[] args){
  
  TestThreadMethod t = new TestThreadMethod(t
  
  TestThreadMethod t = new TestThreadMethod(t
  
  tstart() //(
  
  //tstart()
  
  tstart() //(
  
  }}
  
  運行結果為
  
  t shareVar =
  
  因為t和t是兩個不同對象所以線程t調用代碼()不能喚起線程t如果去掉代碼()的注釋並注釋掉代碼(結果為
  
  t shareVar =
  
  t shareVar =
  
  這是因為當代碼()的線程執行到代碼()時它進入停滯狀態並釋放對象的鎖狀態接著代碼()的線程執行run()由於此時 shareVar值為所以執行打印語句並調用代碼()使代碼()的線程進入可執行狀態然後代碼()的線程結束當代碼()的線程重新執行後它接著執行for()循環一直到shareVar=然後打印shareVar
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27510.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.