day23總結——多執行緒
阿新 • • 發佈:2018-11-07
一、多執行緒——一個應用程式有多條執行路徑
2、程序:正在執行的應用程式
3、執行緒:程序的執行單元,執行路徑
4、多執行緒:一個應用程式有多條執行路徑
~多程序的意義?——提高CPU的使用率
~多執行緒的意義?——提高應用程式的使用率
二、Java程式的執行原理及JVM的啟動時多執行緒的嗎?
A:Java命令去啟動JVM,JVM會啟動一個程序,該程序會啟動一個主執行緒
B:JVM的啟動是多執行緒的,因為它最低有兩個執行緒啟動了,主執行緒和垃圾回收執行緒
三、多執行緒的實現方案
A:繼承Thread類
/*
* 方式1:繼承Thread類。
* 步驟
* A:自定義類MyThread繼承Thread類。
* B:MyThread類裡面重寫run()?
* 為什麼是run()方法呢?
* C:建立物件
* D:啟動執行緒
*/
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + ":" + i);
}
}
}
public class MyThreadDemo { public static void main(String[] args) { // 建立兩個執行緒物件 MyThread my1 = new MyThread(); MyThread my2 = new MyThread(); // 啟動執行緒 my1.start(); my2.start(); } }
B:實現Runnable介面
/*
* 方式2:實現Runnable介面
* 步驟:
* A:自定義類MyRunnable實現Runnable介面
* B:重寫run()方法
* C:建立MyRunnable類的物件
* D:建立Thread類的物件,並把C步驟的物件作為構造引數傳遞
*/
public class MyRunnable implements Runnable { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } }
public class MyRunnableDemo {
public static void main(String[] args) {
// 建立MyRunnable類的物件
MyRunnable mr = new MyRunnable();
Thread t1 = new Thread(mr, "CC");
Thread t2 = new Thread(mr, "DD");
t1.start();
t2.start();
}
}
四、執行緒的排程和優先順序問題
A:執行緒的排程 | B:獲取和設定執行緒優先順序 * 如何獲取執行緒物件的優先順序? * public final int getPriority():返回執行緒物件的優先順序 * 如何設定執行緒物件的優先順序呢? * public final void setPriority(int newPriority):更改執行緒的優先順序。
|
a:分時排程 | a:預設是5 |
b:搶佔式排程 (Java採用的是該排程方式) | b:範圍是1-10 |
五、執行緒的控制(方法)
A:休眠執行緒 public static void sleep(long millis) |
B:加入執行緒 public final void join():等待該執行緒終止。 |
C:禮讓執行緒 public static void yield():暫停當前正在執行的執行緒物件,並執行其他執行緒。 |
D:後臺執行緒 public final void setDaemon(boolean on) |
E:終止執行緒(掌握) public void interrupt() |
六、執行緒的生命週期
新建——就緒——執行——阻塞——死亡
七、電影賣票程式的實現
A:繼承Thread類
B:實現Runnable介面
八、電影院賣票程式出問題
A:為了更符合真實場景,加入了休眠100ms
B:買票問題 a:同票多次 b:負數票
九、多執行緒安全問題的原因(也是我們以後判斷一個程式是否有執行緒安全問題的依據)
A:是否有多執行緒環境B:是否有共享資料
C:是否有多條語句操作共享資料
十、同步解決執行緒安全問題
A:同步程式碼塊synchronized(物件) {
需要被同步的程式碼;
}
這裡的鎖物件可以是任意物件。
B:同步方法
把同步加在方法上。
這裡的鎖物件是this
C:靜態同步方法
把同步加在方法上。
這裡的鎖物件是當前類的位元組碼檔案物件(反射再講位元組碼
十一、回顧以前的執行緒安全的類
A:StringBufferB:Vector
C:Hashtable
D:如何把一個執行緒不安全的集合類變成一個執行緒安全的集合類
用Collections工具類的方法即可。