空中網4k 5k月薪挑選大四實習生的執行緒題

2022-06-23 21:45:10 字數 2043 閱讀 9835

空中網4k/5k月薪挑選大四實習生的執行緒題

兩年前,我們一個大四的學員去應聘空中網的實習生職位,空中網只給他出了三道執行緒題,拿回家做兩天後再去給經理講解,如果前兩題做好了給4k月薪,第三道題也做出來的話就給5k的月薪。這樣的實習薪水和招聘要求,不需要有工作經驗的限制,純粹是技術功底的比拼和考核,而不像許多其他公司非要招兩年工作經驗的人,逼得那些剛畢業和未畢業的大學生不得不去撒謊,不得不去做假簡歷,甚至假畢業證!所以,空中網的這份工作對未畢業的大學生來說,還是很有吸引力的。這個學生是否入職空中網,大家去猜吧,免得有人看不順眼而叫罵,呵呵!

第一題:現有的程式**模擬產生了16個日誌物件,並且需要執行16秒才能列印完這些日誌,請在程式中增加4個執行緒去呼叫parselog()方法來分頭列印這16個日誌物件,程式只需要執行4秒即可列印完這些日誌物件。原始**如下:

package read;

public class test

} }//parselog方法內部的**不能改動

public static void parselog(string log) catch (interruptedexception e) }

}

第二題:現成程式中的test類中的**在不斷地產生資料,然後交給testdo.dosome()方法去處理,就好像生產者在不斷地產生資料,消費者在不斷消費資料。請將程式改造成有10個執行緒來消費生成者產生的資料,這些消費者都呼叫testdo.dosome()方法去進行處理,故每個消費者都需要一秒才能處理完,程式應保證這些消費者執行緒依次有序地消費資料,只有上一個消費者消費完後,下一個消費者才能消費資料,下一個消費者是誰都可以,但要保證這些消費者執行緒拿到的資料是有順序的。原始**如下:

package queue;

public class test }}

//不能改動此testdo類

class testdo catch (interruptedexception e)

string output = input + ":"+ (system.currenttimemillis() / 1000);

return output;

}}

第三題:現有程式同時啟動了4個執行緒去呼叫testdo.dosome(key, value)方法,由於testdo.dosome(key, value)方法內的**是先暫停1秒,然後再輸出以秒為單位的當前時間值,所以,會列印出4個相同的時間值,如下所示:

4:4:1258199615

1:1:1258199615

3:3:1258199615

1:2:1258199615

請修改**,如果有幾個執行緒呼叫testdo.dosome(key, value)方法時,傳遞進去的key相等(equals比較為true),則這幾個執行緒應互斥排隊輸出結果,即當有兩個執行緒的key都是"1"時,它們中的一個要比另外其他執行緒晚1秒輸出結果,如下所示:

4:4:1258199615

1:1:1258199615

3:3:1258199615

1:2:1258199616

總之,當每個執行緒中指定的key相等時,這些相等key的執行緒應每隔一秒依次輸出時間值(要用互斥),如果key不同,則並行執行(相互之間不互斥)。原始**如下:

package syn;

//不能改動此test類

public class test extends thread

public static void main(string args) throws interruptedexception

public void run()

}class testdo

private static testdo _instance = new testdo();

public static testdo getinstance()

public void dosome(object key, string value) catch (interruptedexception e)

} }}