首頁 > Java > java教程 > 主體

Java—進程與執行緒的實例詳解

PHP中文网
發布: 2017-06-21 17:04:20
原創
2110 人瀏覽過
  • 進程與執行緒

  進程是程式(任務)的執行過程,具有動態性;持有資源(共享記憶體、共享檔案)和執行緒,是資源和執行緒的載體。

  線程是系統中最小的執行單元,同一進程中有多個線程,線程共享進程的資源。

  執行緒的交互,交互的方式包括互斥與同步。

  •  執行緒的常用方法

  java對執行緒的支援主要體現在類別Thread和介面Runnable,它們都繼承java.lang包,有一個共同的方法run()

   

  • #執行緒停止的正確方法

public class ArmyRunnable implements Runnable {//volatile保证了线程可以正确读取其他线程写入的值volatile boolean keepRunning = true;
    @Overridepublic void run() {while(keepRunning) {//发动五连击for (int i = 0; i < 5 ; i++) {
                System.out.println(Thread.currentThread().getName() + "进攻对方[" + i + "]");
            }//暂停            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName() + "结束了战斗");
    }
}
登入後複製

# 爭用條件

  當當多個執行緒同時共享存取相同數據(記憶體區域)時,每個執行緒都嘗試操作該數據,從而導致數據被破壞(corrupted),這種現象稱為爭用條件。

線程的交互:互斥與同步
  • #  互斥:在同一時間,只能有一條線程去對我們的關鍵數據或臨界區進行操作。
  互斥的實作:sysnchronized(intrinsic lock),sysnchronized相當於給程式碼加上一把鎖,讓其他執行緒不能進入這個關鍵區域存取我們的關鍵資源。

  同步:是執行緒之間的一種通訊機制, 由於一條執行緒的某些條件不具備,使得其他執行緒處於某種等待的狀態,之後由於條件具備了,一條執行緒會用某種方式喚醒其他的執行緒。

      同步的實作:wait()/notify()/notifyAll()--Object物件的成員方法
  1.   wait set 是執行緒的休息室

  2. public void transfer(int from, int to, double amount) {//通过synchronized 关键字来实现互斥,synchronized既可以出现在方法之上,也能以块的形式出现在方法体之中//通过对lockObj加锁实现互斥//加锁操作是有开销的,多次加锁操作会降低系统的性能synchronized (lockObj) {//while循环,保证条件不满足时任务都会被条件阻挡,而不是继续竞争CPU资源while (energyBoxes[from] < amount) {try {//条件不满足,将当前线程放入锁对象(lockObj)上的wait set//wait set 是线程的休息室                    lockObj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName());
                energyBoxes[from] -= amount;
                System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to);
                energyBoxes[to] += amount;
                System.out.printf("能量总和:%10.2f%n",getTotalEnergies());            //唤醒所有在lockObj对象上等待的线程            lockObj.notifyAll();
            }
            
        }
    登入後複製
  3. Runnable方式和Thread方式建立執行緒的差異

    # 
Runnable方式可以避免Thread方式由於Java單一繼承特性所帶來的缺陷

    Runnable的程式碼可以被多個執行緒(Thread實例)共享,適合於多個執行緒處理
  1. 相同資源

    的狀況

  2. ##  
    就緒:建立了執行緒物件後,呼叫了執行緒的start()方法(此時執行緒只是進入了執行緒佇列,等待取得CPU服務,具備了執行的條件,但不一定已經開始執行了)。
  1. 運行:處於就緒狀態的線程,一旦取得了CPU資源,便進入到運行狀態,開始執行run()方法裡面的邏輯。
  2. 終止:執行緒的run()方法執行完畢,或是執行緒呼叫了stop()方法(這個方法已經out),執行緒便進入終止狀態。
  3. 阻塞:正在執行的線程在某些情況下,由於某種原因而暫時讓出了CPU資源,暫停了自己的執行,便進入了阻塞狀態,如呼叫了sleep()方法
    使用者執行緒與守護執行緒

使用者執行緒:運行在前台,執行具體的任務,如程序的主線程、連接網絡的子線程

#守護線程:運行在後台,為其他前台線程服務,一旦所有用戶線程都結束運行,守護線程會隨JVM一起結束工作。

守護執行緒的應用:資料庫連線池中的監控執行緒、JVM虛擬機啟動後的監控執行緒。最常見的守護線程是垃圾回收線程

  • 設定守護線程:透過呼叫Thread類別的setDaemon(true)方法來設定目前的執行緒為守護線程。注意:setDaemon(true)必須在start()方法之前調用,否則會拋出異常;在守護線程中產生的新線程也是守護線程;不是所有的任務都可以分配給守護線程來執行,例如讀寫操作或者計算邏輯。

擴充

#########  Java Memory Mode#######  Locks & Condition######  執行緒安全性:原子性與可見性...######  多執行緒程式設計常用的互動模型######  Java5中並發程式設計工具#############參考書# ###########  core java######  Java concurrency in practice###

以上是Java—進程與執行緒的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板