多執行緒的建立方式有兩種:
繼承thread類,並覆蓋run()方法
實現runnable介面,並實現run()方法
其中run()方法中存放的是執行緒執行的**。其中實現介面的方式避免了單繼承的侷限性,定義執行緒時,建議使用實現介面的方式。
學習多執行緒,要認清多執行緒的5種執行狀態,這5種狀態分別是:建立,執行,消亡,凍結,阻塞。
剛建立的執行緒,呼叫start()方法轉為執行,如果執行中呼叫sleep()會轉為凍結,直到凍結時間到了會轉為阻塞(具備執行資格但沒執行權),阻塞狀態要等到取得執行權才會轉為執行狀態,執行緒執行中呼叫stop()方法或者執行緒正常執行結束都會轉到消亡。
在多執行緒的執行中,會經常出現一些安全問題。
public class ticket implements runnable catch (interruptedexception e)
system.out.println(thread.currentthread().getname()+" "+tickets--);
} }public static void main(string args)
}
上面例子是模擬現實多個視窗賣票,但執行後發現票數出現為負的情況,這就是多執行緒的安全問題。
當乙個執行緒在執行操作共享資料的**塊且只操作其中一部分時,另乙個執行緒參加進來,導致共享資料的錯誤。
以上**可以修改如下:
public class ticket implements runnable catch (interruptedexception e)
system.out.println(thread.currentthread().getname()+" "+tickets--);
}} }
public static void main(string args)
上面**中的畫線部分就是加上的**,只要在運算元據的**塊外面加synchronized(object)。這種操作叫作同步**塊,即乙個執行緒在執行期間同步**塊內容的時候,另乙個執行緒是不能訪問的,相當於加上了鎖,只有當操作的執行緒執行完時,其他執行緒才可以執行這塊**,這就避免了上面的錯誤。同步**塊雖然解決了多執行緒安全問題,但因為多個執行緒需要判斷鎖,較為消耗資源。
解決安全問題除了同步**塊,還有同步函式。即在操作共享資料的方法返回型別前加上synchronized關鍵字。
單例模式也有關於同步的操作,具體如下:
public class single
public static single getinstance()
} return obj;
}}
多執行緒還有個比較重要的知識點是執行緒間通訊的等待喚醒機制。
class resource
public void setname(string name)
public void getname()
public synchronized void put() throws interruptedexception
public synchronized void get() throws interruptedexception
}
以上**是為了實現資源生產乙個,消費乙個的需求。標誌位為真時,生產線程休息,標誌位為假時,消費執行緒休息。一開始標誌位為假,當生產乙個商品後,將標誌位設為真,同時喚醒其他執行緒,由於標誌位為真,接下來肯定時消費執行緒執行。消費執行緒消費乙個商品後,將標誌位為假,這就等於將執行權交給生產線程。
jdk1.5以後有了lock,condition上面**可用如下替換:
class resource
public void setname(string name)
public void getname()
public void put() throws interruptedexception finally }
public void get() throws interruptedexception finally }
}
由上可知,jdk1.5將同步synchronized替換成現實lock操作。將object 中的 wait,notify,notifyall,替換成了condition,該物件可通過lock獲取。其中乙個lock可對應多個condition,可實現本方只喚醒對方操作。
多執行緒的學習
工作需要要用到多執行緒了,呵呵,高科技呀 public partial class form1 form delegate void lbdelegate private void button1 click object sender,eventargs e private void gettim...
多執行緒的學習
閒來無事,在逛論壇時偶然看到這樣一道題 子執行緒迴圈十次,接著主線程迴圈一百次,接著又回到子執行緒迴圈十次,然後主線程再迴圈一百次,如此迴圈往復,迴圈五十次。嘗試著做了一下,首先定義了乙個內部類circle,類中有兩個方法分別演示子線和主線的迴圈,main方法和sub方法,並給這兩個方法加鎖,用sy...
多執行緒學習
thread和runnable的區別 單繼承模式thread 而 runnable是介面 start 和run的區別 start是乙個執行緒只能啟動,run可以執行多次,並且run是呼叫當前正在執行的執行緒 wait notify object物件所具有的 sleep setpriority 同步機...