首頁>技術>

JAVA併發之多執行緒基礎(1)

在JAVA中,談到併發問題肯定是談到多執行緒相關。可以說這兩個之間有著一定的關係。在這裡就為大家簡單的說下多執行緒的基礎,之後的文章中會繼續講解多執行緒相關。

什麼是執行緒

執行緒是程序內的執行單元。一個程序中含有若干個執行緒,執行緒可以看做粒度更小的任務執行單元。程序之間切換,消耗的資源是很大的。通過執行緒去處理會很好的節省相關資源。

執行緒狀態轉化

這上面是針對於執行緒的狀態轉化一個簡單描述。這上面可以看到blocked的之間的狀態只有一條線來回。這塊的話關乎到sychronized的底層實現原理,大家可以自行了解下。這裡面我就省略了一個Running的一個狀態。Running的狀態在可執行狀態(Runnable)之後。

執行緒實現幾種方式

繼承Thread類實現Runnable介面實現Callable介面

上面是是實現執行緒的三種方式。在呼叫執行緒時候,呼叫的是其start()方法,而不是呼叫的run()方法。其中第三種實現方式結合Future可以獲取到執行緒的返回值(同時,線上程池裡面執行多執行緒的話,使用exec.execute()是拿不到執行緒執行的返回值,使用exec.submit()可以通過上面的Future取得執行緒執行的返回值)。

執行緒方法

1.stop(),這個方法使得當前所執行的執行緒停止,釋放所有的monitor。但是使用這個方法會導致多執行緒的資料不一致性(假設兩個執行緒執行中去停止,再次操作的時候,執行緒2有可能搶到原本執行緒1執行的步驟上)。

@Deprecated //提示過期方法 public final void stop() { //獲取SecurityManager進行校驗 SecurityManager security = System.getSecurityManager(); if (security != null) { checkAccess(); if (this != Thread.currentThread()) { security.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION); } } if (threadStatus != 0) { // 如果執行緒被掛起,則喚醒執行緒;否則不執行任何操作 resume(); } // 呼叫系統方法去停止執行緒 stop0(new ThreadDeath()); }複製程式碼

2.interrupt(),這個方法會設定執行緒中斷狀態。是一個比較合理使用的一個方法。

public void interrupt() { if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) {//加鎖控制 Interruptible b = blocker; if (b != null) { interrupt0(); // 設定中斷位 b.interrupt(this); return; } } interrupt0(); }複製程式碼

3.interrupted()判斷當前執行緒是否被中斷,並且清除當前執行緒中斷狀態。

public static boolean interrupted() { return currentThread().isInterrupted(true); }複製程式碼

4.sleep()方法是讓執行緒等待的。在大多數執行緒等待的方法中都會丟擲InterruptedException異常。同時該方法不會釋放鎖以及所佔用的資源。同時它會清除中斷標誌,所以在catch中再對該執行緒設定下中斷標誌。

public static native void sleep(long millis) throws InterruptedException;複製程式碼

5.suspend()方法是讓當前執行緒掛起,不會釋放鎖。

@Deprecated public final void suspend() { checkAccess(); suspend0(); }複製程式碼

6.resume()方法是讓執行緒繼續執行。使用這個的方法就有一個注意點,如果呼叫這個方法在suspend之前,那麼執行緒就會永久的掛起,這個時候就會永久的佔用了資源,可能會導致死鎖的發生。

@Deprecated public final void resume() { checkAccess(); resume0(); }複製程式碼

7.join()的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。

public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }複製程式碼

這裡面實際上呼叫的還是Object中的wait()方法。

這塊也是對於當前使用最多的執行緒操作方法做了一個小的總結,在下一講中我會談及到JUC下面的各個鎖操作。

162

Java

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 「轉」memcache核心,一文搞定!面試再也不怕了