併發概念彙總html
http://www.letiantian.me/2015-05-27-java-concurrency-summary/java
併發的系統文章多線程
http://www.cnblogs.com/dolphin0520/category/602384.html併發
http://www.cnblogs.com/timlearn/tag/Java%E5%B9%B6%E5%8F%91/this
http://blog.csdn.net/ghsau/article/category/1707779spa
最簡單的java線程池與任務隊列.net
http://www.cnblogs.com/null7/archive/2012/09/20/2696108.html線程
中斷機制htm
http://www.cnblogs.com/timlearn/p/4008783.htmlblog
一.運行一個線程
運行一個線程的方法十分簡單,咱們只需調用Thread實例的start()方法便可,當咱們調用start()方法以後,Java虛擬機會爲咱們建立一個線程,而後在該線程中運行run()方法中定義的任務,真正實現多線程。
在這裏,必須強調的是應該調用start()方法,而不是run()方法,直接調用run()方法,虛擬機不會新建線程運行任務,只會在當前線程執行任務,沒法實現多線程併發,因此應該調用start()方法。
二.中止一個線程
(1)標誌位方法
在任務中定義一個標誌位,而後任務會按期查看標誌位,若是設置了標誌位,則任務結束。注意,標誌位必要設置爲volatile類型。
咱們使用這項技術來枚舉素數。
public class PrimeGenerator implements Runnable {
private final List<BigInteger> primes = new ArrayList<BigInteger>();
private volatile boolean cancelled;
public void run() {
BigInteger p = BigInteger.ONE;
while (!cancelled) {
p = p.nextProbablePrime();
synchronized (this) {
primes.add(p);
}
}
}
public void cancel() {
cancelled = true;
}
public synchronized List<BigInteger> get() {
return new ArrayList<BigInteger>(primes);
}
}
當cancel()方法調用後,while就會結束,整個線程也會結束。
(2)使用中斷中止線程
在(1)中的使用標誌位的方法中,有一個問題,若是線程的任務是阻塞任務,那麼線程在阻塞時將沒法去查看標誌位,所以也沒法中止。
當出現這種狀況時,咱們可使用中斷,有部分阻塞庫方法是支持中斷的,線程中斷是一個協做機制,線程能夠經過這種機制來通知另外一個線程,告訴它在合適或者可能的狀況下中止當前的工做,
並轉而執行其它的工做。
修改上面的ArrayList爲BlockingQueue,BlockingQueue的put()是能夠阻塞的,若是還使用標誌位的方法,那麼當put阻塞後,將沒法再執行while判斷,這時咱們就可使用中斷標誌位的方法來判斷結束線程。,
public class PrimeProducer extends Thread {
private final BlockingQueue<BigInteger> queue;
PrimeProducer(BlockingQueue<BigInteger> queue) {
this.queue = queue;
}
public void run() {
try {
BigInteger p = BigInteger.ONE;
while (!Thread.currentThread().isInterrupted())
queue.put(p = p.nextProbablePrime());
} catch (InterruptedException consumed) {
/* Allow thread to exit */
}
}
public void cancel() {
interrupt();//Thread.interrupt()
}
}
這時,咱們注意到,cancel()調用時,設置了當前線程的中斷標誌位爲true,BlockingQueue的put()方法能夠響應中斷,並從阻塞狀態返回,返回後,while語句檢測到中斷位被標誌,而後結束整個while
循環,從而結束線程。
(3)不能響應中斷的阻塞方法
若是阻塞方法能夠響應中斷,咱們就可使用(2)中的方法結束線程,可是還有一些阻塞方法不能響應中斷。這裏就要經過關閉底層資源,讓代碼throw異常的方式來結束線程。(略)