多執行緒Demo-空中網面試題(張孝祥講解)
摘自傳智播客_張孝祥_空中網挑選實習生的面試題 視訊教程的,(主要是執行緒與佇列的使用).
與本人無關,僅供以後參考使用
空中網4k/5k月薪挑選大四實習生的執行緒題兩年前,我們一個大四的學員去應聘空中網的實習生職位,空中網只給他出了三道執行緒題,拿回家做兩天後再去給經理講解,如果前兩題做好了給4k月薪,第三道題也做出來的話就給5k的月薪。這樣的實習薪水和招聘要求,不需要有工作經驗的限制,純粹是技術功底的比拼和考核,而不像許多其他公司非要招兩年工作經驗的人,逼得那些剛畢業和未畢業的大學生不得不去撒謊,不得不去做假簡歷,甚至假畢業證!所以,空中網的這份工作對未畢業的大學生來說,還是很有吸引力的。這個學生是否入職空中網,大家去猜吧,免得有人看不順眼而叫罵,呵呵!
第一題:現有的程式程式碼模擬產生了16個日誌物件,並且需要執行16秒才能列印完這些日誌,請在程式中增加4個執行緒去呼叫parseLog()方法來分頭列印這16個日誌物件,程式只需要執行4秒即可列印完這些日誌物件。原始程式碼如下:
- package read;
- publicclass Test {
- publicstaticvoid main(String[] args){
- System.out.println("begin:"+(System.currentTimeMillis()/1000));
-
/*模擬處理16行日誌,下面的程式碼產生了16個日誌物件,當前程式碼需要執行16秒才能列印完這些日誌。
- 修改程式程式碼,開四個執行緒讓這16個物件在4秒鐘打完。
- */
- for(int i=0;i<16;i++){ //這行程式碼不能改動
- final String log = ""+(i+1);//這行程式碼不能改動
- {
- Test.parseLog(log);
- }
- }
- }
-
//parseLog方法內部的程式碼不能改動
- publicstaticvoid parseLog(String log){
- System.out.println(log+":"+(System.currentTimeMillis()/1000));
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
修改後的程式碼如下:
- package read;
- import java.util.concurrent.ArrayBlockingQueue;
- import java.util.concurrent.BlockingQueue;
- publicclass Test {
- publicstaticvoid main(String[] args){
- final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);
- for(int i=0;i<4;i++){
- new Thread(new Runnable(){
- @Override
- publicvoid run() {
- while(true){
- try {
- String log = queue.take();
- parseLog(log);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }).start();
- }
- System.out.println("begin:"+(System.currentTimeMillis()/1000));
- /*模擬處理16行日誌,下面的程式碼產生了16個日誌物件,當前程式碼需要執行16秒才能列印完這些日誌。
- 修改程式程式碼,開四個執行緒讓這16個物件在4秒鐘打完。
- */
- for(int i=0;i<16;i++){ //這行程式碼不能改動
- final String log = ""+(i+1);//這行程式碼不能改動
- {
- try {
- queue.put(log);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //Test.parseLog(log);
- }
- }
- }
- //parseLog方法內部的程式碼不能改動
- publicstaticvoid parseLog(String log){
- System.out.println(log+":"+(System.currentTimeMillis()/1000));
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
//*****************************************************
第二題:現成程式中的Test類中的程式碼在不斷地產生資料,然後交給TestDo.doSome()方法去處理,就好像生產者在不斷地產生資料,消費者在不斷消費資料。請將程式改造成有10個執行緒來消費生成者產生的資料,這些消費者都呼叫TestDo.doSome()方法去進行處理,故每個消費者都需要一秒才能處理完,程式應保證這些消費者執行緒依次有序地消費資料,只有上一個消費者消費完後,下一個消費者才能消費資料,下一個消費者是誰都可以,但要保證這些消費者執行緒拿到的資料是有順序的。原始程式碼如下:
- package queue;
- publicclass Test3 {
- publicstaticvoid main(String[] args) {
- System.out.println("begin:"+(System.currentTimeMillis()/1000));
- for(int i=0;i<10;i++){ //這行不能改動
- String input = i+""; //這行不能改動
- String output = TestDo.doSome(input);
- System.out.println(Thread.currentThread().getName()+ ":" + output);
- }
- }
- }
- //不能改動此TestDo類
- class TestDo {
- publicstatic String doSome(String input){
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- String output = input + ":"+ (System.currentTimeMillis() / 1000);
- return output;
- }
- }
修改後的程式碼如下:
-
相關推薦
多執行緒Demo-空中網面試題(張孝祥講解)
摘自傳智播客_張孝祥_空中網挑選實習生的面試題 視訊教程的,(主要是執行緒與佇列的使用). 與本人無關,僅供以後參考使用 空中網4k/5k月薪挑選大四實習生的執行緒題 兩年前,我們一個大四的學員去應聘空中網的實習生職位,空中網只給他出了三道執行緒
多執行緒三: NSThread 面試題
- (void)viewDidLoad { [super viewDidLoad]; NSThread *thread = [[NSThread alloc] initWithBlock:^{ NSLog(@"1"); }]; [thread st
JAVA多執行緒和併發基礎面試題
多執行緒和併發問題是Java技術面試中面試官比較喜歡問的問題之一。在這裡,從面試的角度列出了大部分重要的問題,但是你仍然應該牢固的掌握Java多執行緒基礎知識來對應日後碰到的問題。(校對注:非常贊同這個觀點) Java多執行緒面試問題 1. 程序和執行緒之間有什麼不同
JUC多執行緒及高併發面試題
JUC多執行緒及高併發 [TOC] 一、請你談談對volatile的理解 Package java.util.concurre
Java多執行緒與併發基礎面試題
> CS-LogN思維導圖:記錄專業基礎 面試題 開源地址:https://github.com/FISHers6/CS-LogN ![](https://img2020.cnblogs.com/blog/1454456/202006/1454456-20200619205756557-112814415
Java多執行緒方面的程式設計筆試題(通過繼承Thread類啟動執行緒)
/* * 寫兩個執行緒,一個執行緒列印 1~52,另一個執行緒列印字母A-Z。列印順序為12A34B56C……5152Z。要求用執行緒間的通訊。 * 注:分別給兩個物件構造一個物件o,數字每列印兩
個人珍藏的80道多執行緒併發面試題(1-10答案解析)
前言 個人珍藏的80道Java多執行緒/併發經典面試題,因為篇幅太長,現在先給出1-10的答案解析哈,後面一起完善,並且上傳github哈~ ❝ https://github.com/whx123/JavaHome ❞ 「公眾號:撿田螺的小男孩」 1. synchronized的實現原理以及鎖優化? sync
個人珍藏的80道多執行緒併發面試題(11-20答案解析)
## 前言 個人珍藏的80道Java多執行緒/併發經典面試題,現在給出11-20的答案解析哈,並且上傳github哈~ > https://github.com/whx123/JavaHome [個人珍藏的80道多執行緒併發面試題(1-10答案解析)](https://juejin.im/post/
常見的執行緒安全相關的面試題
HashMap 和 HashTable的區別 HashMap 和 HashTable都實現 Map介面,都是鍵值對儲存資料的方式 區別1: HashMap 可以存放 null HashTable 不能存放 null 區別二: Has
Python簡單的多執行緒demo:常用寫法
def func1(a,b,c): pass func1(1,2,3) func1(1,2,3,4,5,6) print() def func1(*args, **kwargs): print(args) print(kwaigs) func1(1,2,3,4) fnc1(x
java多執行緒 demo ,包含帶返回值的Callable和不帶返回值的Runnable
輸入int,利用callable取得double值,再用runnable列印 import java.util.concurrent.*; public class TestMultiThread { private static ExecutorService pool = nul
Python 計算從1-10000內的素數(多執行緒demo)
Python 計算從1-10000內的素數 素數:質數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。 利用for迴圈從1-10000將值賦值給i 在函式中判斷i是否為素數,用這個數求餘這個數以內的數判斷餘數是否為0 素數返回True,不是素數返回Fals
多執行緒爬取網易雲歌曲評論
之前用爬蟲爬取了拉鉤網的崗位資訊,而那個效率比較低,現在略作升級,做成多執行緒,目標也換成了網易雲。首先在瀏覽器上開啟網易雲音樂,找到想要爬取的歌曲,我選擇的是《一直很安靜》,開啟開發者工具,找到網路,在html的響應中並未找到歌曲評論,再到xhr中找,很容易就能找到一個名為
多執行緒demo-主執行緒和子執行緒交替執行
package Thread; /** * 實現效果:主執行緒執行10次,子執行緒執行100次,主執行緒和子執行緒迴圈交替執行50次 主要演示synchronized和wait、notify的使用 * 適用場景:只有兩個執行緒的情況,呵呵 */ public c
android handler 多執行緒demo
andriod提供了 Handler 和 Looper 來滿足執行緒間的通訊。為了研究其中執行緒機制的問題,寫了2個demo:Demo1:package com.mp; import android.app.Activity; import android.os.Bundle; import android.
Java多執行緒demo
demo程式碼如下:package com.test; import java.util.concurrent.CountDownLatch; import java.util.concurrent.E
教你用 Python 多執行緒爬京東商城商品評論(代理ip請閱讀上一篇)
爬蟲永不停息 最近改進上一篇的爬蟲,不爬豆瓣了,改爬一爬京東評論,先放幾張圖研究看看先。 研究了一下,發現商品的id就是連結.html前面的數字。我們把它複製貼上下拉 1,對上一篇的代表進行修改和新增 class Spider(): def
Qt 筆記:多執行緒與介面元件的通訊(上)
是否可以在子執行緒中建立介面元件? class TestThread : public QThread { Q_OBJECT protected: void run() { QWidget w; w.show();
Qt:筆記:多執行緒與介面元件的通訊(下)
子執行緒能夠更改介面元件狀態的本質是什麼? -子執行緒發射訊號通知主執行緒介面更新請求;主執行緒根據具體訊號遺蹟訊號引數對介面元件進行修改。 是否有其他間接的方式可以讓子執行緒更新介面元件的狀態? 解決方案 - 傳送自定義事件 -自定義事件類用於描述介面更新細節 -在主視窗類中重
JAVA多執行緒wait與notify詳細解析(由生產者和消費者案例引出)
生產者和消費者這個關係是個經典的多執行緒案例。現在我們編寫一個Demo來模擬生產者和消費者之間的關係。 假如有兩個類,一個是資料生產者類DataProvider,另一個是資料消費者類DataConsumer,這兩個類同時對資料類Data進行操作,生產者類負責生產資料,消費者類負責消費資料,下面是