1. 程式人生 > >day23總結——多執行緒

day23總結——多執行緒

一、多執行緒——一個應用程式有多條執行路徑

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:StringBuffer
B:Vector
C:Hashtable
D:如何把一個執行緒不安全的集合類變成一個執行緒安全的集合類
用Collections工具類的方法即可。