金山的一道有關執行緒的筆試題

2021-06-18 13:38:15 字數 1890 閱讀 4986

在北京時參加金山校招的一道筆試題:

四個執行緒,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...