1. 程式人生 > >23(多執行緒2)

23(多執行緒2)

1 休眠執行緒

2 守護執行緒

這個概念需要解釋一下,以象棋為例,非守護執行緒相當於帥,守護執行緒相當於車馬相士,當帥都沒了,車馬相士就失去了它的意義了,就是非守護執行緒停止了,守護執行緒也就gg了。

結果就是aaaa不會輸出50次了。

3 加入執行緒(插隊執行緒)

4 禮讓執行緒和設定優先順序setPriority()

5 同步程式碼塊

同步程式碼塊這裡也需要解釋一下,有的時候回發生一件事情,在一個執行緒中,程式碼還麼有完全執行結束,就被另外一個執行緒搶佔過去,所以就需要使得這個執行緒中的程式碼執行完畢,就加上一把鎖,也就是上圖的程式碼的示意。

6 同步方法

宣告為同步方法,保證是一把鎖,才會使得程序之間不會出錯。鎖物件的概念很重要。

7 執行緒安全問題(火車售票)

package com.haidai.thread;

/*
 * 執行緒安全問題:火車賣票問題
 * 100張票,4個視窗賣票
 */
public class Demo7 {

	public static void main(String[] args) {
		new Ticket().start();
		new Ticket().start();
		new Ticket().start();
		new Ticket().start();
	}

}

class Ticket extends Thread {
	private static int num = 100;

	@Override
	public void run() {
		while (true) {
			synchronized (Ticket.class) {
				if (num <= 0) {
					break;
				}
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {

					e.printStackTrace();
				}
				System.out.println(getName() + "號視窗售:這是第 " + (num--) + " 號票");
			}
		}

	}

}

需要在賣票的程式碼加上·同步鎖,這樣不會出錯。

package com.haidai.thread;

public class Demo8 {

	public static void main(String[] args) {
		MyTicket mt = new MyTicket();
		new Thread(mt).start();
		new Thread(mt).start();
		new Thread(mt).start();
		new Thread(mt).start();
		new Thread(mt).start();
	}

}
class MyTicket implements Runnable{
	private int num = 100;
	@Override
	public void run() {
		while (true) {
			synchronized (Ticket.class) {
				if (num <= 0) {
					break;
				}
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {

					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + "號視窗售:這是第 " + (num--) + " 號票");
			}
		}
	}
	
}

8 死鎖

哲學家只有一隻筷子的故事,2個人拿著對方的資源不釋放,於是死鎖了,為了避免同步程式碼塊死鎖,就不要巢狀同步程式碼塊

9總結

對於同步程式碼塊或者同步方法,他們中的物件必須要是相同的物件才可以是的執行緒安全,好比方說,鎖就是話筒,只有一個話筒,只有一個人拿到了話筒,他才可以說話。