Java-JavaSE-多線程
- 概述
- 進程
- 正在運行的程序,是系統進行資源分配和調用的獨立單位。
- 每個進程都有它本身的內存空間和系統資源。
- 線程
- 是進程中的單個順序控制流,是一條執行路徑
- 一個進程若是隻有一條執行路徑,則稱爲單線程程序。
- 一個進程若是有多條執行路徑,則稱爲多線程程序。
- 並行
- 邏輯上同時發生,指在某一個時間內同時運行多個程序。
- 併發
- 物理上同時發生,指在某一個時間點同時運行多個程序。
- Thread類的方法
- Thread.currentThread().getName();
- public final String getName();
- 線程的狀態
- 被建立
- 運行
- start()
- 具有CPU的執行資格和執行權,其實就是它正在被CPU處理
- 臨時阻塞
- 凍結
- sleep(time)-Thread類的靜態方法
- sleep()方法會拋出異常,你必須catch,不能拋出,由於父類的run()方法沒有拋異常
- 不釋放鎖
- 必須指定time
- wait()-Object類的方法
- 結束
- 多線程的2種方式
- 第一種方法:繼承Thread類,而後複寫run()方法,run()方法裏就是線程須要執行的內容,而後建立對象調用start()方法來啓動線程(JVM會調用run()方法)
- 若是隻是單獨調用run()方法的話,只意味着子類的對象在調用一個普通的函數而已,與線程的開闢無關
- 第二種方法(由於Java不支持多繼承):實現Runnable接口,覆蓋run()方法,建立Thread對象,且傳入該類的對象,使用Thread對象調用start()方法
- 線程安全
- 產生的緣由
- 多個線程操做同一個共享數據
- 操做共享數據的代碼有多條
- 當一條線程操做共享數據的過程當中,其餘線程參與了共享數據的運算,此時就出現了線程安全問題
- 解決辦法
- 同步
- 同步的前提
- 同步的方式
- 1.同步代碼塊synchronized(obj){}
- 2.同步函數:給函數加synchronized修飾符
- 同步函數的鎖:this;固然,同步代碼塊也能夠使用this,synchronized(this)
- 靜態synchronized同步函數使用的鎖是這個函數所屬的字節碼的文件對象。這個鎖能夠使用this.getclass()獲取,也能夠使用類名.class來獲取
- 死鎖
- 產生緣由
- 有2個鎖,某個線程任務持有鎖a,須要鎖b才能繼續執行代碼,而另外一個線程任務此時持有鎖b,在等待鎖a執行其剩餘代碼。
- 線程間通訊
- 多個線程處理同一個資源,可是任務不一樣,好比一存一取
- 等待喚醒機制
- 用於存一取一,多存多取(要用到while循環判斷,notifyAll()方法喚醒線程池中全部的線程),區別於只多條取
- 方法,這些方法必須定義在同步中,由於須要明確究竟是操做的哪一個鎖上的線程:
- 要調用這些方法,須要用監視器去調用。而監視器能夠是任意的對象,因此這些方法都定義在Object中(注意,監視器和鎖的區分)
- wait();(讓線程進入線程池,不會被賦予執行資格,會釋放執行權,釋放鎖!),
- notify();(喚醒線程池中的任意線程),
- notifyAll();(喚醒線程池中的全部線程)
- (以上3個方法的調用者,必須和同步使用的鎖是一致的!)
- 1.5新特性
- Lock lock =new ReentrantLock();
- 定義一個鎖,用來標識須要進行同步的線程執行內容
- 開始結束標示:lock.lock();lock.unlock();(一般定義在finally代碼塊中)
- Condition c =lock.newCondition();
- 定義一個監視器,能夠定義多個
- c具備Object監視器的對線程操做的方法:await();signal();signalAll();
- 線程相關的方法
- 中斷線程的方法
- stop()方法--已過期
- run()方法結束
- 通常都有循環結構,控制循環條件的話,就能夠控制線程結束的條件
- interrupt()方法的使用
- 用於中斷線程的wait()、sleep()狀態,同時拋出一個interruptedException
- interrupt()方法不會中斷一個正在運行的線程。這一方法實際上完成的是,在線程受到阻塞時拋出一箇中斷信號,這樣線程就得以退出阻塞的狀態。更確切的說,若是線程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那麼,它將接收到一箇中斷異常(InterruptedException),從而提前地終結被阻塞狀態
- 注意要處理InterruptedException
- setDaemon
- public final void setDeamon(boolean on)
- 將一個線程設置爲後臺線程或者用戶線程,當所剩線程所有都是daemon線程後,JVM退出
- on爲true的時候設置線程爲Daemon
- 須要在線程啓動前就設置
- join()方法
- 線程t start()之後,t.join()了,那麼當前線程會等你t結束後,當前線程纔會得到CPU執行資格
- 拋出InterruptedException
- 線程的priority
- 1-10,數字越大,優先級越高
- setPriority(Thread.MAX_PRIORITY);
歡迎關注本站公眾號,獲取更多信息