關於多執行緒練習的幾個題目

2022-03-07 20:27:45 字數 1609 閱讀 2247

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

交給四個執行緒,列印16個日誌物件資訊,啟動四個執行緒容易,但是怎樣將這16個日誌物件交給4個執行緒,這時候我們用阻塞佇列,將要列印的日誌資訊放到阻塞佇列中,四個執行緒啟動時都從阻塞佇列中取資料,取完後列印即可。阻塞佇列的大小可以自行設定。

1

public

class

test catch

(exception e) 19}

20}2122

}).start();23}

24for (int i = 0; i < 16; i++) catch

(exception e) 33}

34}35}

36//

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

37public

static

void

parselog(string log) catch

(interruptedexception e) 44}

45 }

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

解答:10個執行緒,依次消費資料,仍然是將待消費資料放入阻塞佇列,讓10個執行緒去取資料消費,所不同的是這次消費必須乙個乙個執行緒來,而不再是10個執行緒一起去取,因此用到了執行緒的同步。同步方法有多種,這裡使用semaphore來進行執行緒間的同步,**及注釋如下:

1

public

class

test catch

(exception e) 21}

2223

}).start();24}

2526 system.out.println("begin:"+(system.currenttimemillis()/1000));

27for(int i=0;i<10;i++) catch

(exception e)

34//

string output = testdo.dosome(input);

//不斷消費資料

35//

system.out.println(thread.currentthread().getname()+ ":" + output);36}

37}38 }

關於多執行緒的一道題目

題目大意 有四個執行緒,每個執行緒輸出1,2,3,4,設計程式使得依次輸出 1111222233334444 求解思路 建立乙個物件o,當四個執行緒依次輸出1後,檢測已經輸出的次數count,如果輸出次數為1,2,3,那麼讓執行緒進入物件o的等待集,如果為4,那麼喚醒o中等待集中所有執行緒並將cou...

多執行緒練習

1 請在指定位置插入 實現列印輸出1 99。package com.company.deno class demo public void method 結束位置 thread t new thread a t.start 2 檢查 並修改 class test implements runnabl...

多執行緒練習

問題 以下四個程式doother方法的執行需不需要等待dosome方法的結束?程式1 public class exam01 catch interruptedexception e t2.start class mythread extends thread override public voi...