1. 程式人生 > >第九章作業

第九章作業

1.    一個程序就是一個執行中的程式,而每一個程序都有自己獨立的一塊
記憶體空間、一組系統資源,每一個程序的內部資料和狀態都是完全獨立的。

     Java程式執行中的單個順序的流控制稱為執行緒,多執行緒則指一個程序中可

以同時執行多個不同的執行緒,執行不同的任務。

2.

java執行緒分為前臺執行緒(也稱使用者執行緒或普通執行緒)和後臺執行緒(Daemon thread)。

     後臺執行緒會隨著主執行緒(main執行緒)的結束而結束,但是前臺程序則不會(如果main執行緒先於前臺程序結束,前臺程序仍然會執行);或者說,只要有一個前臺執行緒未退出,程序就不會終止。

     預設情況下,程式設計師建立的執行緒是使用者執行緒;用setDaemon(true)可以設定執行緒為後臺執行緒;而用isDaemon( )則可以判斷一個執行緒是前臺執行緒還是後臺執行緒;

     jvm的垃圾回收器其實就是一個後臺執行緒;

     setDaemon函式必須在start函式之前設定,否則會丟擲IllegalThreadStateException異常;

 3.

兩種

方式一:直接繼承執行緒Thread類。該方法編寫簡單,可以直接操作執行緒,由於已經繼承了Thread,不能再繼承其他類了。

方式二:實現Runnable介面。當一個類已繼承了另一個類時,就只能用實現Runnable介面的方式來建立執行緒;另外,使用此方法的更多原因是多個執行緒共享某個物件的資源。
4.

建立,就緒, 執行, 阻塞, 死亡。

start(), wait(), sleep(), join(), yield()

5.

執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。

多執行緒同時訪問共享資源(變數),導致執行緒安全問題。

採用加鎖機制, 加入執行緒同步的技術。

synchronized 程式碼塊:監視器就是指定的物件。
synchronized 方法:監視器就是this物件。
synchronized 靜態方法:監視器就是相應的Class物件。

6.

執行緒之間需要一些協調通訊,來共同完成一件任務。

使用wait和notifyAll實現執行緒間同步通訊 。

7.

死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。

8.

class Dummy implements Runnable{
	private int count = 0;
	public void A() {
		System.out.println(Thread.currentThread().getName() + "  A");
		synchronized (this) {
			System.out.println(Thread.currentThread().getName() + "  A  " + count++);
		}
	}
	public synchronized void B() {
		System.out.println(Thread.currentThread().getName() + "  B  " + count++);
	}
	@Override
	public void run() {
		while(count < 100) {
			A();
			B();
		}
	}
}
public class Test {
	public static void main(String[] args) {
		Dummy d = new Dummy();
		Thread t1 = new Thread(d);
		Thread t2 = new Thread(d);
		t1.start();
		t2.start();
	}
}
9.
class Dummy_1 implements Runnable {
	public static boolean flag = true; 
	@Override
	public void run() {
		while(flag) {
			System.out.println("i am dummy_1");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
class Dummy_2 implements Runnable {

	@Override
	public void run() {
		Dummy_1.flag = false;
		System.out.println("i am dummy_2");
	}
}
public class Test {
	public static void main(String[] args) {
		new Thread(new Dummy_1()).start();
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		new Thread(new Dummy_2()).start();
		System.out.println("main over");
	}
}