在北京時參加金山校招的一道筆試題:
四個執行緒,a b c d ,共享乙個變數 i, ab 為加執行緒,cd 為減執行緒,四個執行緒依次執行,順序為 abcd,輸出為 0 1 2 1 0 1 2 1 0……
當時覺得這道題還可以,不一會兒就寫出來了,我的思路是:四個執行緒,ab為乙個鎖,cd為乙個鎖,兩個鎖交替執行,每個鎖的兩個執行緒交替執行。後來回校後,zw問這道題,我又重新打了一下,寫了好長時間,老是不對,執行緒的執行順序總是控制不好,執行緒語法也老出錯,一陣o(╯□╰)o,基礎太薄弱……搜了搜方茅塞頓開。
public class jinsan2 catch (interruptedexception e)
}system.out.println(thread.currentthread().getname()+" "+i++ + " ");
flag2 = !flag2;
lock.notifyall();}}
}};
thread b = new thread("b") catch (interruptedexception e)
}system.out.println(thread.currentthread().getname()+" "+i++ + " ");
flag1 = false;
flag2 = !flag2;
lock.notifyall();}}
}};
thread c = new thread("c") catch (interruptedexception e)
}system.out.println(thread.currentthread().getname()+" "+i-- + " ");
flag2 = !flag2;
lock.notifyall();}}
}};
thread d = new thread("d") catch (interruptedexception e)
}system.out.println(thread.currentthread().getname()+" "+i-- + " ");
flag1 = true;
flag2 = !flag2;
lock.notifyall();}}
}};
a.start();
b.start();
c.start();
d.start();
}}
還有乙個更好的方法就是為每個執行緒都標乙個id,a b c d 分別物件 0 1 2 3 ,這樣,所有執行緒都共享乙個 count 變數,每個執行緒執行時,都 首先獲count%4 的值,如果對應自己執行緒的id,那麼就執行,否則等待,id=0 || id=1 表示是 a b 執行緒,則對 i 進行 加操作,否則進行 減操作這樣四個執行緒都可以用同乙個邏輯進行操作
public class test
@override
public void run() catch (interruptedexception e)
}if (id == 0 || id == 1)
if (id == 2 || id == 3)
system.out.println(thread.currentthread().getname()
+ " " + i-- + " ");
count++;
lock.notifyall();
} }
} }
public static void main(string args)
}
另外我呼叫wait(),notify()時呼叫的是this的,正確的呼叫應該是哪個鎖物件就呼叫哪個物件的方法,我這可怕的基本功(ˇˍˇ)
一道2005金山筆試題
問題描述 2005年11月金山筆試題。編碼完成下面的處理函式。函式將字串中的字元 移到串的前部分,前面的非 字元後移,但不能改變非 字元的先後順序,函式返回串中字元 的數量。如原始串為 ab cd e 12,處理後為 abcde12,函式並返回值為5。要求使用盡量少的時間和輔助空間 include ...
一道關於下標排序的金山筆試題
有這樣一道筆試題它是這樣描述的 對乙個陣列按照給定下標排序,僅使用兩兩交換的方式,要求盡可能少的額外空間。栗子 原陣列 a b c d e,假若它的排序下標為 3 0 1 4 2,那仫排序後為 d a b e c。剛開始看到這道題,我想了一種最簡單的實現方式就是重新開闢和陣列parr一樣大的空間,通...
一道筆試題
看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...