-
1 # 首席分享官100
-
2 # 使用者50623762565
package com.cg.test;
/**
* 設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1。
* 寫出程式。
* 下程式使用內部類實現執行緒,對j增減的時候沒有考慮順序問題。
* @author ai_zxc
*
*/
public class ThreadTest1{
private int j;
public static void main(String args[]){
ThreadTest1 tt=new ThreadTest1();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc); //建立執行緒例項 將實現了Runnable介面的類 作為構造方法的引數
t.start(); //啟動執行緒
t=new Thread(dec);
t.start();
}
}
/**
*加一 ,對此方法加鎖 synchronized 對方法加鎖 相當於對 方法操作的當前的資源加鎖
*/
private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
/**
* 減一 對此方法加鎖 synchronized 對方法加鎖 相當於對 方法操作的當前的資源加鎖
*/
private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
/**
* 內部類 實現Runnable介面
* @author ai_zxc
*
*/
class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
}
/**
* 內部類 實現Runnable介面
* @author ai_zxc
*
*/
class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();
}
}
回覆列表
//解決方案-1 設定3把鎖, 然後把鎖們應用到所有執行緒中 (涉及到synchronized wait notify等, 嫌麻煩. 略)
解決方案-2 設定3個全域性共享的訊號標記(訊號燈) + 3子執行緒分別佔用標記1 2 3
+ 主執行緒輪詢/等待
(簡潔明快 推薦)
//解決方案-2 實現如下:
static boolean t1_done = false;
static boolean t2_done = false;
static boolean t3_done = false;
//t1------run() { ............ ; t1_done = true; }
//t2、 3: 同理,略
main () { .............;
啟動t1;
啟動t2;
啟動t3;
//輪詢 or 等待
while ( true )
if ( t1_done && t2_done && t3_done) break;
else
Thread.yield
() ;// 或 Thread.sleep(xxxx) ----若子執行緒執行超過100ms以上,應予考慮
//輪詢結束,主執行緒繼續工作
} //main END
have fun