稍微修改下?? 未測試
為利辛等地區(qū)用戶提供了全套網頁設計制作服務,及利辛網站建設行業(yè)解決方案。主營業(yè)務為做網站、網站制作、利辛網站設計,以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
package?com.leejiliang.HomeworkDemo2;
/**
*?定義打印輸出類,定義兩個數據輸出方法,分別用于輸出偶數和奇數
*?
*?@author?Administrator?even偶數?uneven奇數
*/
class?PrintNumber?{
boolean?isEven?=?true;
public?void?printEven()?{
for?(int?i?=?0;?i?=?100;?i?=?i?+?2)?{
if?(i?%?2?==?0)?{
synchronized?(this)?{
while?(!isEven)?{
try?{
this.wait();
}?catch?(InterruptedException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
}
System.out.println("偶數:"?+?i);
isEven?=?false;
this.notify();
}
}
}
}
//?輸出1到100之間的奇數
public?void?printUnEven()?{
for?(int?i?=?1;?i?=?99;?i?=?i?+?1)?{
if?(i?%?2?!=?0)?{
synchronized?(this)?{
while?(isEven)?{
try?{
this.wait();
}?catch?(InterruptedException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
}
System.out.println("奇數:"?+?i);
isEven?=?true;
this.notify();
}
}
}
}
}
/**
*?
*?@author?Administrator?定義輸出偶數的線程類
*/
class?ThreadForEven?implements?Runnable?{
private?PrintNumber?pn?=?null;
public?ThreadForEven(PrintNumber?pn)?{
this.pn?=?pn;
}
@Override
public?void?run()?{
pn.printEven();
}
}
/**
*?定義輸出奇數的線程類
*?
*?@author?Administrator
*
*/
class?ThreadForUneven?implements?Runnable?{
private?PrintNumber?pn?=?null;
public?ThreadForUneven(PrintNumber?pn)?{
this.pn?=?pn;
}
@Override
public?void?run()?{
pn.printUnEven();
}
}
//?主函數,執(zhí)行兩個線程
class?ZeroToOneHundred?{
public?static?void?main(String[]?args)?{
PrintNumber?pn?=?new?PrintNumber();
ThreadForEven?te?=?new?ThreadForEven(pn);
ThreadForUneven?tu?=?new?ThreadForUneven(pn);
Thread?threadeven?=?new?Thread(te);
Thread?threaduneven?=?new?Thread(tu);
threadeven.start();
threaduneven.start();
}
}
首先說用M定義的線程,這里M相當于繼承線程方法的類,在這個類里給它定義了線程方法。當在public方法里創(chuàng)建M的實例時,類M中的方法也被實例化了,所以當用t.start();啟動線程時,是啟動的M中的線程。再說for中的,和上邊完全相反,這個線程只是開啟了線程,并沒有定義其它方法,當程序運行時能和上邊程序同時運行,所以都是1,這是for循環(huán)的結果
首先,你同步的是具體的某個Test實例, 對于那個實例來說,實際上只有一個線程訪問了那個代碼塊,但是sum和other卻是多個線程同時去進行訪問,實際上這是不安全的,如果你想實現每次都輸出10000的效果,那么正確的應該是在Test.class上加鎖,而不是獲取Test實例的鎖,修改后的代碼如下:
public?class?Test?extends?Thread?{
public?static?int?sum?=?10000;
public?static?int?other?=?0;
public?void?getMoney()?{
synchronized?(Test.class)?{
System.out.println(Thread.currentThread().getName()?+?"?開始執(zhí)行");
sum?=?sum?-?100;
System.out.println("sum-100");
other?=?other?+?100;
System.out.println("other+100");
System.out.println(sum?+?other);
System.out.println(Thread.currentThread().getName()?+?"?執(zhí)行完成");
}
}
public?void?run()?{
getMoney();
}
public?static?void?main(String[]?agrs)?{
Thread?t[]?=?new?Thread[10];
for?(int?i?=?0;?i?=?9;?i++)?{
t[i]?=?new?Test();
t[i].start();
}
}
}
// 上面代碼能得到你的結果