//監視與同步2
class Demo498
{
public static void main(String[] args)
{
Apple apple1 = new Apple("甲");
Apple apple2 = new Apple("乙");
Apple apple3 = new Apple("丙");
}
}
class Apple implements Runnable
{
String name;
static int totalApple = 10000000;
int apple;
Thread thread;
Apple(String name)
{
this.apple = 0;
thread = new Thread(this,name);
thread.start();
}
public void run()
{
while (eatApple() == true)
{
apple++;
}
System.out.println(thread.getName() +"吃了"+ apple +"個蘋果");
}
public synchronized static boolean eatApple( )
{
if (totalApple >0)
{
totalApple--;
return true;
}
else
{
return false;
}
}
}
這個是書上的範例程式
我有2個問題
第一個在 thread = new Thread(this,name);
那個this 是指 Apple1或Apple2或Apple3 對嗎?
因為this的功能我只知道2種
this.apple = 0;
this(); 呼叫無參數建構子
第二個問題在
當甲正在呼叫eatApple 乙丙就不能
那當甲結束之後,又是換誰
我會有這個問題是因為顯示結果有時差異很大
如果有哪邊觀念錯誤請跟我說
請高手幫解惑!!
謝謝!!!
2006-12-15 12:06:07 · 1 個解答 · 發問者 ANDY 2 in 電腦與網際網路 ➔ 程式設計
還有一個不是問題static int totalApple = 10000000;
那個static 是代表什麼意思?
是說只會被執行一次
還是說 totalApple會一直改變。
2006-12-15 12:13:11 · update #1
這是Thread建構子的其中之一
public Thread(Runnable target,String name)
就是程式碼裡的用法
thread = new Thread(this,name);
this指的是現在正在執行的物件
name指的是傳入這個物件的名稱,可自定
所以,當apple1執行的時後,指的就是apple1
apple2執行的時後,指的就是apple2
以此類推…
因為public synchronized static boolean eatApple( )有宣告同步
意思就是,在一個時間點,只能有一個物件去eatApple(),
想要去eat apple的物件,只能等待正在eat apple的物件吃完,
才能進去吃。
至於,甲吃完。乙、丙誰會進去吃?
就要看誰先排在前面,或者誰比較大…
一般情況,沒有設定優先權的情形之下
甲、乙、丙是一樣大的,所以,在執行的時後,看誰
分配到的cpu時間比較多,就吃比較多的apple嘍
2006-12-15 18:05:33 補充:
所以,每次執行的結果都不一樣就是這個原因
2006-12-15 18:34:20 補充:
static 是宣告為靜態的意思
就是當它被執行到的時後
被宣告為static 方法或者變數
都會存在記憶體裡,不會隨
著物件消失而消失
每個物件都可以不透過類別物件的方式去指定它
2006-12-15 13:05:03 · answer #1 · answered by ? 2 · 0⤊ 0⤋