[TOC]
## 1. sleep
1. wait,sleep,join,I/O導致的block,會被interrupted方法中斷.
2. 這些可中斷方法,在捕捉到中斷信號后,也就是捕獲了InterruptedException異常,就會擦出interrupt標識。

因為捕獲到了信號,所以標識被擦出,輸出false
## 1.1 特性
1、使線程進入執行時間的休眠
2、不會放棄monitor鎖的所有權
## 1.2 TimeUnit
### 1.2.1 省去換算,表達清晰
是一個枚舉類,對sleep進行了很好的封裝,并省去了時間換算的過程。例如使線程休眠4分15秒
1、以前的寫法是
~~~
Thread.sleep(4*60*1000 + 15 * 1000);
~~~
2、TimeUnit省去換算 ,而且清晰
~~~
TimeUnit.MINUTES.sleep(4);
TimeUnit.SECONDS.sleep(15);
~~~
### 1.2.2 時間不同單位之間的換算
TimeUnit還提供了便捷方法用于把時間轉換成不同單位,例如,如果你想把秒轉換成毫秒,你可以使用下面代碼:
~~~
TimeUnit.SECONDS.toMillis(129)
~~~
TimeUnit更加強大,在需要使用sleep的時候,建議使用TimeUnit
## 2. yield
### 2.1 特性
yield屬于一種啟發式的方法,會提箱調度器表示當前線程原因放棄cpu資源,如果cpu資源不緊張,則會忽略這種題型。
## 3. yield于sleep
1、sleep只是暫時停止,沒有時間片的消耗
2、yield執行后,如果調度器沒有忽略這個提示,則會導致上下文切換。
3、sleep可以捕捉到interrupt信號,yield不能
### 3.1 wait和sleep的區別
一、wait特性:
1. 線程調用了某個對象的wait方法后,都會放入該對象monitor相關聯的wait set 中,并釋放monitor的所有權!
2. notify喚醒wait set中的一個thread,notifyall喚醒wait set中所有的阻塞線程,喚醒后仍需要爭奪鎖
二、wait和sleep的區別
1、wait是Object類的方法,所有類都有這個方法,sleep是Thread特有的方法
2、wait必須持有對象的monitor鎖,也是就說wait必須在同步方法中執行
3、wait會釋放鎖,sleep不會釋放鎖
4、wait需要在同步方法中執行,sleep不需要。而且要求執行wait的方法和同步所用的鎖關聯對象是同一個。

同步對象是this,但是調用MUTEX的wait方法,此時會拋出IllegalMonitorStateException!
### 3.2 wait和sleep的相同點
1、sleep和wait都是可中斷方法,被打斷后,都會收到中斷異常InterruptdException,同時擦除interrupt標識
## 4. interrupt
### 4.1 interrupt特性
1、只對由于wait,sleep,join等造成阻塞的線程起作用!對于沒有阻塞的線程 不起作用
2、interrupt和stop不同的是,它不會終止整個線程,而是終止Object.wait, Thread.join和Thread.sleep三種方法造成的阻塞狀態,果在調用它時,線程處于阻塞狀態了,調用interrupt會拋出InterruptedException
3、打斷一個線程并不是線程的生命周期的結束,而是打斷了線程的阻塞狀態
~~~
package com.tuna.test.thread;
public class InterruptThread1 extends Thread {
public static void main(String[] args) {
InterruptThread1 t = new InterruptThread1();
t.start();
try {
Thread.sleep(1000);
t.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
for (int i = 0; i <= 200000; i++) {
try {
Thread.sleep(2000);
System.out.println("i=" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
~~~
如下輸出,中斷異常后,不會影響線程的繼續執行
```
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.tuna.test.thread.InterruptThread1.run(InterruptThread1.java:21)
i=1
i=2
i=3
i=4
i=5
...
```
**執行interrupted方法和可中斷方法攔截InterruptedException后會擦出中斷標記**
### 4.2 實例

兩毫秒后,主線程打斷子線程的阻塞,子線程捕獲中斷異常,輸出“Oh,i am be interrupted”
### 4.3 interrupt flag
1、每個線程都有一個interrupt flag,當調用線程被interrupt,該標記會被設置
2、當線程調用了可中斷方法進入阻塞時,調用interrupt方法被調用,flag將會被清除,說明線程已經打斷了interrupt狀態(非阻塞),此時調用isInterrupted方法時,返回false。
### 4.4 判斷線程是否被中斷
1、**isInterrupted**
判斷線程是否被中斷


**調用sleep可中斷方法,進入阻塞**
第一次輸出,因為沒有被中斷,所以輸出false
第二、三輸出時,線程被中斷,但是**interrupt flag被擦除了**,依然輸出false
2、 **interrupted**
判斷是否被中斷
1)如果線程被打斷了,第一次調用interrupted將返回true,并立即擦除interrupt flag標記
2)第二次及以后調用interrupted都會返回false,除非次線程再一次被打斷

子線程不斷輸出,期間main線程打斷了一下子線程,所以會輸出一次true,并且馬上擦擦除標記,繼續輸出 false。
由此看出,**interrupt不會影響非阻塞(可中斷)的線程的繼續執行**
## 5. join
阻塞線程,可中斷
B調用A線程join方法,b進入阻塞,知道A執行完成
## 6 線程進入runnable狀態
1、阻塞I/O完成,比如網絡i/o完成,進入runnable狀態
2、完成了指定得休眠sleep,進入runnable狀態
3、wait中的線程被其他線程notify/notifyall喚醒,進入runnable狀態
4、獲取到了某個鎖資源,進入runnable狀態
5、線程在阻塞過程中,被其他線程interrupted,進入runnable狀態
- 計算機網絡
- 基礎_01
- tcp/ip
- http轉https
- Let's Encrypt免費ssl證書(基于haproxy負載)
- what's the http?
- 網關
- 網絡IO
- http
- 工具
- Git
- 初始本地倉庫并上傳
- git保存密碼
- Gitflow
- maven
- 1.生命周期命令
- 聚合與繼承
- 插件管理
- assembly
- 資源管理插件
- 依賴范圍
- 分環境打包
- dependencyManagement
- 版本分類
- 找不到主類
- 無法加載主類
- 私服
- svn
- gradle
- 手動引入第三方jar包
- 打包exe文件
- Windows
- java
- 設計模式
- 七大原則
- 1.開閉原則
- 2. 里式替換原則
- 3. 依賴倒置原則
- 4. 單一職責原則
- 單例模式
- 工廠模式
- 簡單工廠
- 工廠方法模式
- 抽象工廠模式
- 觀察者模式
- 適配器模式
- 建造者模式
- 代理模式
- 適配器模式
- 命令模式
- json
- jackson
- poi
- excel
- easy-poi
- 規則
- 模板
- 合并單元格
- word
- 讀取
- java基礎
- 類路徑與jar
- 訪問控制權限
- 類加載
- 注解
- 異常處理
- String不可變
- 跨域
- transient關鍵字
- 二進制編碼
- 泛型1
- 與或非
- final詳解
- Java -jar
- 正則
- 讀取jar
- map
- map計算
- hashcode計算原理
- 枚舉
- 序列化
- URLClassLoader
- 環境變量和系統變量
- java高級
- java8
- 1.Lambda表達式和函數式接口
- 2.接口的默認方法和靜態方法
- 3.方法引用
- 4.重復注解
- 5.類型推斷
- 6.拓寬注解的應用場景
- java7-自動關閉資源機制
- 泛型
- stream
- 時區的正確理解
- StringJoiner字符串拼接
- 注解
- @RequestParam和@RequestBody的區別
- 多線程
- 概念
- 線程實現方法
- 守護線程
- 線程阻塞
- 筆試題
- 類加載
- FutureTask和Future
- 線程池
- 同步與異步
- 高效簡潔的代碼
- IO
- ThreadLocal
- IO
- NIO
- 圖片操作
- KeyTool生成證書
- 壓縮圖片
- restful
- 分布式session
- app保持session
- ClassLoader.getResources 能搜索到的資源路徑
- java開發規范
- jvm
- 高并發
- netty
- 多線程與多路復用
- 異步與事件驅動
- 五種IO模型
- copy on write
- code style
- 布隆過濾器
- 筆試
- 數據庫
- mybatis
- mybatis與springboot整合配置
- pagehelper
- 分頁數據重復問題
- Java與數據庫之間映射
- 攔截器
- 攔截器應用
- jvm
- 堆內存測試
- 線程棧
- 直接內存
- 內存結構
- 內存模型
- 垃圾回收
- 調優
- 符號引用
- 運行參數
- 方法區
- 分帶回收理論
- 快捷開發
- idea插件
- 注釋模板
- git
- pull沖突
- push沖突
- Excel處理
- 圖片處理
- 合并單元格
- easypoi
- 模板處理
- 響應式編程
- reactor
- reactor基礎
- jingyan
- 規范
- 數據庫