1. 程式人生 > >多執行緒Demo-空中網面試題(張孝祥講解)

多執行緒Demo-空中網面試題(張孝祥講解)

摘自傳智播客_張孝祥_空中網挑選實習生的面試題 視訊教程的,(主要是執行緒與佇列的使用).

與本人無關,僅供以後參考使用大笑

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

    第一題:現有的程式程式碼模擬產生了16個日誌物件,並且需要執行16秒才能列印完這些日誌,請在程式中增加4個執行緒去呼叫parseLog()方法來分頭列印這16個日誌物件,程式只需要執行4秒即可列印完這些日誌物件。原始程式碼如下:
  1. package read;  
  2.    publicclass Test {  
  3.        publicstaticvoid main(String[] args){  
  4.            System.out.println("begin:"+(System.currentTimeMillis()/1000));  
  5.            /*模擬處理16行日誌,下面的程式碼產生了16個日誌物件,當前程式碼需要執行16秒才能列印完這些日誌。
     
  6.            修改程式程式碼,開四個執行緒讓這16個物件在4秒鐘打完。 
  7.            */
  8.            for(int i=0;i<16;i++){  //這行程式碼不能改動
  9.                final String log = ""+(i+1);//這行程式碼不能改動
  10.                {  
  11.                         Test.parseLog(log);  
  12.                }  
  13.            }  
  14.        }  
  15.        //parseLog方法內部的程式碼不能改動
  16.        publicstaticvoid parseLog(String log){  
  17.            System.out.println(log+":"+(System.currentTimeMillis()/1000));  
  18.            try {  
  19.                Thread.sleep(1000);  
  20.            } catch (InterruptedException e) {  
  21.                e.printStackTrace();  
  22.            }          
  23.        }  
  24.    }  

修改後的程式碼如下:

  1. package read;  
  2. import java.util.concurrent.ArrayBlockingQueue;  
  3. import java.util.concurrent.BlockingQueue;  
  4. publicclass Test {  
  5.     publicstaticvoid main(String[] args){  
  6.         final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);  
  7.         for(int i=0;i<4;i++){  
  8.             new Thread(new Runnable(){  
  9.                 @Override
  10.                 publicvoid run() {  
  11.                     while(true){  
  12.                         try {  
  13.                             String log = queue.take();  
  14.                             parseLog(log);  
  15.                         } catch (InterruptedException e) {  
  16.                             // TODO Auto-generated catch block
  17.                             e.printStackTrace();  
  18.                         }  
  19.                     }  
  20.                 }  
  21.             }).start();  
  22.         }  
  23.         System.out.println("begin:"+(System.currentTimeMillis()/1000));  
  24.         /*模擬處理16行日誌,下面的程式碼產生了16個日誌物件,當前程式碼需要執行16秒才能列印完這些日誌。 
  25.         修改程式程式碼,開四個執行緒讓這16個物件在4秒鐘打完。 
  26.         */
  27.         for(int i=0;i<16;i++){  //這行程式碼不能改動
  28.             final String log = ""+(i+1);//這行程式碼不能改動
  29.             {  
  30.                     try {  
  31.                         queue.put(log);  
  32.                     } catch (InterruptedException e) {  
  33.                         // TODO Auto-generated catch block
  34.                         e.printStackTrace();  
  35.                     }  
  36.                     //Test.parseLog(log);
  37.             }  
  38.         }  
  39.     }  
  40.     //parseLog方法內部的程式碼不能改動
  41.     publicstaticvoid parseLog(String log){  
  42.         System.out.println(log+":"+(System.currentTimeMillis()/1000));  
  43.         try {  
  44.             Thread.sleep(1000);  
  45.         } catch (InterruptedException e) {  
  46.             e.printStackTrace();  
  47.         }         
  48.     }  
  49. }  

//*****************************************************


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

  1. package queue;  
  2.     publicclass Test3 {  
  3.         publicstaticvoid main(String[] args) {  
  4.             System.out.println("begin:"+(System.currentTimeMillis()/1000));  
  5.             for(int i=0;i<10;i++){  //這行不能改動
  6.                 String input = i+"";  //這行不能改動
  7.                 String output = TestDo.doSome(input);  
  8.                 System.out.println(Thread.currentThread().getName()+ ":" + output);  
  9.             }  
  10.         }  
  11.     }  
  12.     //不能改動此TestDo類
  13.     class TestDo {  
  14.         publicstatic String doSome(String input){  
  15.             try {  
  16.                 Thread.sleep(1000);  
  17.             } catch (InterruptedException e) {  
  18.                 e.printStackTrace();  
  19.             }  
  20.             String output = input + ":"+ (System.currentTimeMillis() / 1000);  
  21.             return output;  
  22.         }  
  23.     }  

修改後的程式碼如下:

  1. 相關推薦

    執行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進行操作,生產者類負責生產資料,消費者類負責消費資料,下面是