線程是Java的內嵌特性,線程并不容易掌握,有專門介紹Java線程的書籍,讀者可以參考。由此可見Java線程的重要性,本文將詳細介紹線程的基本知識。
有的時候你可能想寫一個程序,每隔一段時間執行相關的任務,這個時候你可以使用Timer和TimerTask,非常方便。你可以參考這里。
在Java中實現一個線程有兩種方法,第一是實現Runnable接口實現它的run()方法,第二種是繼承Thread類,覆蓋它的run()方法。下面是代碼示例:
public class DoSomething implements Runnable { public void run(){ // here is where you do something } } public class DoAnotherThing extends Thread { public void run(){ // here is where you do something } } |
Java中的線程有四種狀態分別是:運行、就緒、掛起、結束。如果一個線程結束了也就說明他是一個死線程了。當你調用一個線程實例的start()的方法的時候,這個時候線程進入就緒狀態,注意并不是運行狀態,當虛擬機開始分配給他CPU的運行時間片的時候線程開始進入運行狀態,當線程進入等待狀態,例如等待某個事件發生的時候,這時候線程處于掛起狀態。
啟動一個線程你只需要調用start()方法,針對兩種實現線程的方法也有兩種啟動線程的方法,分別如下:
DoSomething doIt = new DoSomething(); Thread myThread = new Thread( doIt ); myThread.start(); DoAnotherThing doIt = new DoAnotherThing(); |
public class MyThread implements Runnable { private boolean quit = false; public void run(){ public void quit(){ |
如果每個線程只做它自己的事情,那么就很簡單了,但是有的時候幾個線程可能要同時訪問一個對象并可能對它進行修改,這個時候你必須使用線程的同步在方法或者代碼塊使用關鍵字synchronized,例如:
public class Counter { private int counter; public synchronized int increment(){ public synchronized int decrement(){ return counter; |
如果你要是想讓線程等待某個事件的發生然后繼續執行的話,那么這就涉及到線程的調度了。在java中通過wait(),notify(),notifyAll()來實現,這三個方法是在Object類中定義的,當你想讓線程掛起的時候調用obj.wait()方法,在同樣的obj上調用notify()則讓線程重新開始運行。
最后以SUN提供的Producer/Consumer的例子來結束這篇文章,內容是Producer產生一個數字而Consumer消費這個數字,這個小程序里面基本覆蓋了本文所有的知識點。請詳細研究一下代碼
public class Producer extends Thread { private CubbyHole cubbyhole; private int number; public Producer(CubbyHole c, int number) { public void run() { |
public class CubbyHole { public synchronized int get() { public synchronized void put(int value) { public class Consumer extends Thread { public Consumer(CubbyHole c, int number) { public void run() { |
public class ProducerConsumerTest { p1.start(); |
SUN說輸出的結果應該是如下形式,但是在我的機器上卻不是這樣的,做了一些改動才正確,有興趣的朋友可以運行一下看看結果,歡迎和我討論一下!
Producer #1 put: 0 Consumer #1 got: 0 Producer #1 put: 1 Consumer #1 got: 1 Producer #1 put: 2 Consumer #1 got: 2 Producer #1 put: 3 Consumer #1 got: 3 Producer #1 put: 4 Consumer #1 got: 4 Producer #1 put: 5 Consumer #1 got: 5 Producer #1 put: 6 Consumer #1 got: 6 Producer #1 put: 7 Consumer #1 got: 7 Producer #1 put: 8 Consumer #1 got: 8 Producer #1 put: 9 Consumer #1 got: 9 |
原文轉自:http://www.anti-gravitydesign.com