1.什么是多線程編程?什么時候使用?
多線程一般用於當一個程序需要同時做一個以上的任務。多線程通常用於GUI交互程序。一個新的線程被創建做一些耗時的工作,當主線程保持界面與用戶的交互。
2.為什么wait(),notify()和notifyall()函數定義在Object類里面?
因為所有類都是繼承於Object類,這樣所有類就可以簡單的進行多線程編程了。
3.wait()方法和sleep()方法有什么不同?
sleep()方法執行后仍然擁有線程,只是延時。而wait方法放棄了線程控制,其它線程可以運行。
4.Thread和Runnable有什么不同?
JAVA線程控制着程序執行的主路徑。當你用java命令調用JVM時,JVM創建了一個隱式線程來執行main方法。Thread類提供了主線程調用其它線程並行運行的機制。
Runnable接口定義了一個能被Thread運行的類。實現Runnable的類只需要實行run方法。可以很靈活的擴展現在的已經繼承自其它父類的類。而thread則不可以,因為java只允許繼承一個父類。
5.我可以重載start()方法么?
因為Thread類的start()方法並不是final方法,因此可以,但不推薦這樣做。因為在start()方法里創建一個新的線程,進行特定的操作。你可以傳遞一個實現了Runnable接口的類到Thread,或者繼承Thread類,重載run()方法。
6. SwingUtilities.invokeLater(Runnable)方法是用來做什么用的?
這個方法可以在不干擾GUI的事件隊列的情況下在應用程序中執行一個線程。它將runnable對象放在事件的隊列中然后立即返回。只有當這個隊象移到隊列的最前端時它的run()方法才被調用。
7.volatile是用來做什么的?
volatile 的意思是變量的值不能被JVM優化,這樣可以在某一程度上保證變量的可見性。
8.什么是綠色線程?
綠色線程是指所有的代碼JVM都執行在單個操作系統線程,即使是多線程程序,JVM間斷的控制多線程程序而不是用其它的操作系統線程,這種模式已經被廢棄了。
9.編譯運行下面的代碼會發生什么?
A.編譯錯誤,Thread類中的run方法沒有定義
B.運行時錯誤,Thread類中的run方法沒有定義
C.編譯無錯,打印0到9.
D.編譯無錯,不打印任何值
答案:D,調用run不創建線程。
10.關於下面一段代碼,哪些描述是正確的
-
public class Agg {
-
public static void main( String argv[]) {
-
Agg a = new Agg();
-
a.go();
-
}
-
-
public void go() {
-
DSRoss ds1 = new DSRoss("one");
-
ds1.start();
-
}
-
}
-
-
class DSRoss extends Thread {
-
private String sTname = "";
-
-
DSRoss( String s) {
-
sTname = s;
-
}
-
-
public void run() {
-
notwait();
-
System.out.println("finished");
-
}
-
-
public void notwait() {
-
while (true) {
-
try {
-
System.out.println("waiting");
-
wait();
-
} catch ( InterruptedException ie) {
-
}
-
System.out.println(sTname);
-
notifyAll();
-
}
-
}
-
}
A.編譯錯誤
B.能夠編譯,輸出“waiting"
C.能夠編譯, 輸出“waiting",緊接着輸出"finish"
D.運行時錯誤,會拋異常
答案:D,wait必須在Synchronize塊或者函數里。
11.編譯運行下面的代碼會發生什么
-
public class Test extends Thread {
-
private String sThreadName;
-
-
public static void main( String argv[]) {
-
Test h = new Test();
-
h.go();
-
}
-
-
Test() {
-
}
-
-
Test( String s) {
-
sThreadName = s;
-
}
-
-
public String getThreadName() {
-
return sThreadName;
-
}
-
-
public void go() {
-
Test first = new Test("first");
-
first.start();
-
Test second = new Test("second");
-
second.start();
-
}
-
-
public void start() {
-
for (int i = 0; i < 2; i++) {
-
System.out.println(getThreadName() + i);
-
try {
-
Thread.sleep(100);
-
} catch ( InterruptedException e) {
-
System.out.println(e.getMessage());
-
}
-
}
-
}
-
}
A.編譯錯誤
B.輸出first0, second0, first1, second1.
C.輸出first0, first1, second0, second1.
D.運行時錯誤
答案:C,如果要實現B的效果的話應該重載run,而不是start
12.編譯運行下面的代碼會發生什么
-
public class Test {
-
public static void main( String argv[]) {
-
Pmcraven pm1 = new Pmcraven("one");
-
pm1.run();
-
Pmcraven pm2 = new Pmcraven("two");
-
pm2.run();
-
}
-
}
-
-
class Pmcraven extends Thread {
-
private String sTname = "";
-
-
Pmcraven( String s) {
-
sTname = s;
-
}
-
-
public void run() {
-
for (int i = 0; i < 2; i++) {
-
try {
-
sleep(1000);
-
} catch ( InterruptedException e) {
-
}
-
yield();
-
System.out.println(sTname);
-
}
-
}
-
}
A.編譯錯誤
B.輸出One One Two Two
C.輸出One Two One Two
D.輸出One Two One Two
答案B 調用run不創建線程。仍然是同步。