国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java并發編程(3)-- Thread

2019-11-06 09:48:17
字體:
來源:轉載
供稿:網友

1、Thread實現了Runnable接口,所以有兩種線程類,一是繼承Thread類,覆寫run()方法,啟動方式:xxThread xx=new xxThread();xx.start();; 二是實現runnable接口,實現run()方法,啟動方式:Thread t = new Thread(new xxRunnable());t.start();。 推薦后者,將任務從線程中分離出來是比較好的設計,它將任務和任務執行分離開來了。

2、+isAlive():boolean,測試線程當前是否在運行。

3、+join():void,等待線程結束。 join方法的功能就是使異步執行的線程變成同步執行。 t1.start(); t1.join(); System.out.PRintln(a);

4、+yield():void,使線程暫停并允許執行其他線程。 yield()應該做的是讓當前運行線程回到可運行狀態,以允許具有相同優先級的其他線程獲得運行機會。 因此,使用yield()的目的是讓相同優先級的線程之間能適當的輪轉執行。 但是,實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調度程序再次選中。 yield()從未導致線程轉到等待/睡眠/阻塞狀態。在大多數情況下,yield()將導致線程從運行狀態轉到可運行狀態,但有可能沒有效果。 在run()方法中使用 Thread.yield()。

5、synchronized 關鍵字,同步,一次只有一個線程可以訪問 同步方法:public synchronized void deposit(){} 同步語句:synchronized (對象的引用){}

6、利用加鎖同步 Lock lock = new ReentrantLock();創建一個鎖 lock.lock(); //需要同步的代碼 finally{ lock.unlock();//放在finally中確保會被執行 }

7、線程間協作

Condition newDeposit = lock.newCondition(); lock.lock(); while(支出>現存){ newDeposit.await();//當前線程等待,直到發生某個條件 } 現存 - 支出 finally{ lock.unlock();}

…………………………………………………

lock.lock(); 現存++; newDeposit.signalAll();喚醒所有等待線程 finally{ lock.unlock();}

條件由Lock對象創建,為了調用方法(await(),signal(),signalAll()),必須首先擁有鎖。 這三個方法對應java 5之前的wait(),notify(),notifyAll()—–Java的內置監聽器 ,這些方法必須在同步方法或同步塊中調用,當調用wait()方法時,它終止線程同時釋放對象的鎖。當線程被通知后,鎖被重新自動獲取。

8、生產者和消費者

兩個條件的鎖,notEmpty和notFull

public void write(int a){ lock.lock(); try{ while(queue.size()==CAPACITY){ notFull.await(); } queue.offer(a); notEmpty.signal(); }catch(){} finally{ lock.unlock(); } }

…………………………………………

public int read(){ int value=0; lock.lock(); try{ while(queue.isEmpty){ notEmpty.await(); } value=queue.remove(); notFull.signal(); }catch(){} finally{ lock.unlock(); return value; } }

9、阻塞隊列 在試圖向一個滿隊列添加元素或者從空隊列中刪除元素時會導致線程阻塞。 可以用阻塞隊列簡化生產者和消費者例子,因為同步已在阻塞隊列中實現。

10、信號量 信號量可以用來限制訪問共享資源的線程數。在訪問資源前,線程必須從信號量獲取許可。 Semaphore semaphore = new Semaphore(int n);創建一個帶指定數目許可的信號量 semaphore.acquire();獲取許可,信號量中可用許可總量-1,如果無許可可用,線程就被鎖住直到有可用許可為止。 semaphore.release();釋放許可,信號量中可用許可總量+1。

11、死鎖

synchronized (o1) { synchronized (o2) { }}

…………………………..

synchronized (o2) { synchronized (o1) { } }

使用一種名為 資源排序 的簡單技術可以輕易地避免死鎖的發生。

12、線程狀態 線程有5種狀態,新建、就緒、運行、阻塞或結束。 start()后線程進入就緒狀態;run()后進入運行狀態;join()、sleep()、wait()后進入阻塞狀態; yield()進入就緒狀態;run執行完,線程結束。 isAlive()是用來判斷線程狀態的方法,就緒、運行和阻塞返回true;新建、結束返回false。

13、Java集合框架中的類不是線程安全的,Collections類提供六個靜態方法來將集合轉成同步版本。

14、線程同步方式

同步方法;

即有synchronized關鍵字修飾的方法。由于java的每個對象都有一個內置鎖,當用此關鍵字修飾方法時,內置鎖會保護整個方法。在調用該方法前,需要獲得內置鎖,否則就處于阻塞狀態。

同步代碼塊;

即有synchronized關鍵字修飾的語句塊。被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步。

使用特殊域變量(volatile)實現線程同步

a.volatile關鍵字為域變量的訪問提供了一種免鎖機制,b.使用volatile修飾域相當于告訴虛擬機該域可能會被其他線程更新,c.因此每次使用該域就要重新計算,而不是使用寄存器中的值,d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變量 。

使用重入鎖實現線程同步;

在JavaSE5.0中新增了一個java.util.concurrent包來支持同步。ReentrantLock類是可重入、互斥、實現了Lock接口的鎖,它與使用synchronized方法和快具有相同的基本行為和語義,并且擴展了其能力。

使用局部變量實現線程同步;

如果使用ThreadLocal管理變量,則每一個使用該變量的線程都獲得該變量的副本,副本之間相互獨立,這樣每一個線程都可以隨意修改自己的變量副本,而不會對其他線程產生影響。

使用阻塞隊列實現線程同步;

前面5種同步方式都是在底層實現的線程同步,但是我們在實際開發當中,應當盡量遠離底層結構。 使用javaSE5.0版本中新增的java.util.concurrent包將有助于簡化開發。LinkedBlockingQueue<E>是一個基于已連接節點的,范圍任意的blocking queue。 隊列是先進先出的順序(FIFO)。

使用原子變量實現線程同步;

需要使用線程同步的根本原因在于對普通變量的操作不是原子的。那么什么是原子操作呢?原子操作就是指將讀取變量值、修改變量值、保存變量值看成一個整體來操作即-這幾種行為要么同時完成,要么都不完成。在java的util.concurrent.atomic包中提供了創建了原子類型變量的工具類,使用該類可以簡化線程同步。其中AtomicInteger 表可以用原子方式更新int的值,可用在應用程序中(如以原子方式增加的計數器),但不能用于替換Integer;可擴展Number,允許那些處理機遇數字類的工具和實用工具進行統一訪問。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平凉市| 高安市| 孟津县| 江都市| 思茅市| 东丰县| 嘉禾县| 唐河县| 霍城县| 满城县| 大连市| 遵化市| 沈丘县| 呈贡县| 乌兰县| 肇州县| 和硕县| 永定县| 茂名市| 彭州市| 台前县| 太仓市| 出国| 温宿县| 灵武市| 荆州市| 元江| 阆中市| 和龙市| 财经| 文成县| 岗巴县| 晋江市| 绥江县| 松桃| 隆尧县| 三台县| 辉南县| 普兰县| 九台市| 门源|