第九章作業
記憶體空間、一組系統資源,每一個程序的內部資料和狀態都是完全獨立的。
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");
}
}