1.管道
管道是由內核管理的一個緩衝區,其容量受多方面因素影響,包括緩衝區的大小、磁盤容量大小等問題
當管道中沒有信息的話,從管道中讀取的進程會等待,直到另一端的進程放入信息。當管道被放滿信息的時候,嘗試放入信息的進程會等待,直到另一端的進程取出信息。當兩個進程都終結的時候,管道也自動消失。進程對管道進行讀操作和寫操作都可能被阻塞,因此C正確
管道的一端連接一個進程的輸出。這個進程會向管道中放入信息。管道的另一端連接一個進程的輸入,這個進程取出被放入管道的信息,管道可以同時進行讀進程和寫進程
參考網址:http://www.cnblogs.com/biyeymyhjob/archive/2012/11/03/2751593.html
2.
public abstract class Test {
public static void main(String[] args) {
System.out.println(beforeFinally());
}
public static int beforeFinally() {
int a = 0;
try {
a = 1;
return a;
} finally {
a = 2;
}
}
} /**
* output: 1*/
從結果上看,貌似`finally` 裏的語句是在`return` 之後執行的,其實不然,實際上`finally` 裏的語句是在在`return` 之前執行的。那麼問題來了,既然是在之前執行,那爲什麼`a` 的值沒有被覆蓋了?實際過程是這樣的:當程序執行到try{}語句中的return方法時,它會幹這麼一件事,將要返回的結果存儲到一個臨時棧中,然後程序不會立即返回,而是去執行finally{}中的程序, 在執行`a = 2`時,程序僅僅是覆蓋了a的值,但不會去更新臨時棧中的那個要返回的值 。執行完之後,就會通知主程序“finally的程序執行完畢,可以請求返回了”,這時,就會將臨時棧中的值取出來返回。這下應該清楚了,要返回的值是保存至臨時棧中的。
再來看一個例子,稍微改下上面的程序:
public abstract class Test {
public static void main(String[] args) {
System.out.println(beforeFinally());
}
public static int beforeFinally() {
int a = 0;
try {
a = 1;
return a;
} finally {
a = 2;
return a;
}
}
} /**
* output: 2
*/
在這裏,finally{}裏也有一個return,那麼在執行這個return時,就會更新臨時棧中的值。同樣,在執行完finally之後,就會通知主程序請求返回了,即將臨時棧中的值取出來返回。故返回值是2.
再對比下面一題
下面程序的輸出是什麼?
public class Test {
public static String output = " ";
public static void foo(int i) {
try {
if (i == 1) {
throw new Exception();
}
} catch (Exception e) {
output += "2";
return;
} finally {
output += "3";
} output += "4";
}
public static void main(String[] args) {
foo(0);
foo(1);
System.out.println(output);
}
}
答案 3423
參考如下代碼
public class Test {
public static String output = "";
public static String foo(int i) {
try {
if (i == 1) {
throw new Exception();
}
} catch (Exception e) {
output +="2";
return output;
} finally {
output +="3";
} output +="4";
return output;
}
public static void main(String[] args) {
// foo(0);
// System.out.println(output);//輸出34
// foo(1);
// System.out.println(output);//輸出23
// System.out.println(foo(0));//輸出34
// System.out.println(foo(1));//輸出2
}
}