第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java多線程從隊列中取出數據執(zhí)行

java多線程從隊列中取出數據執(zhí)行

牛魔王的故事 2019-05-25 16:00:40
先用python實現,把每一個要處理的參數存放到隊列Queue中,然后創(chuàng)建線程從隊列中取出classThreadExecuteJob(threading.Thread):"""ThreadedUrlGrab"""def__init__(self,queue):threading.Thread.__init__(self)self.queue=queuedefrun(self):while1:i=self.queue.get()try:print"執(zhí)行的參數"+str(i)#發(fā)送執(zhí)行完畢信號self.queue.task_done()exceptExceptionase:logging.warning(str(fun)+"---"+str(e.message)+"---"+str(e.args))defexecute_job_thread_pool(queue):""":paramqueue:隊列:paramarg:函數的參數:return:"""foriinxrange(6):t=ThreadExecuteJob(queue)t.setDaemon(True)t.start()if__name__=="__main__":importQueueday_q=Queue.Queue()foriinxrange(6):day_q.put(i)execute_job_thread_pool(day_q)day_q.join()用python實現的多線程取出0-5個數打印出來?,F在用java粗略實現的如下,但是隊列數據取完了主線程沒有停止,如何讓主線程停止,如何像python那樣隊列數據取完主線程也停止publicclassHelloJava8{publicstaticvoidmain(String[]args)throwsInterruptedException{//TODOAuto-generatedmethodstubBlockingQueues=newLinkedBlockingQueue();s.put("java");s.put("python");s.put("php");s.put("c++");s.put("c");ArrayListthreadList=newArrayList();Threadt1=newThread(newConsumer("zhangsan",s));t1.start();threadList.add(t1);Threadt2=newThread(newConsumer("lisi",s));t2.start();threadList.add(t2);Threadt3=newThread(newConsumer("wangwu",s));t3.start();threadList.add(t3);Threadt4=newThread(newConsumer("afei",s));t4.start();threadList.add(t4);Threadt5=newThread(newConsumer("jb",s));t5.start();threadList.add(t5);for(Threadthread:threadList){thread.join();}System.out.println("主線程執(zhí)行完畢");}}classConsumerimplementsRunnable{privateStringname;privateBlockingQueues=null;publicConsumer(Stringname,BlockingQueues){this.name=name;this.s=s;}publicvoidrun(){try{while(true){Stringproduct=(String)s.take();System.out.println(name+"消費("+product.toString()+").");System.out.println("===============");Thread.sleep(300);}}catch(InterruptedExceptione){e.printStackTrace();}}}
查看完整描述

2 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

Consumer類的run方法中,while的條件應該改為!s.isEmpty()。主線程未能執(zhí)行結束的原因是子線程都沒有結束造成的,因為BlockingQueue.take()造成了阻塞,看一下文檔中寫的
take():取走BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態(tài)直到BlockingQueue有新的數據被加入
也就是說當BlockingQueue中的對象被消費完畢之后,再次調用其take方法,就會進入等待狀態(tài),而題主在程序中使用while(true)作為循環(huán)條件,則所有的線程都會不斷的調用隊列的take方法,而進入阻塞狀態(tài),無法退出線程,子線程無法退出,則join之后的主線程System.out.println("主線程執(zhí)行完畢");則永遠在等待,無法執(zhí)行,故主線程也無法退出。
                            
查看完整回答
反對 回復 2019-05-25
  • 2 回答
  • 0 關注
  • 1229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號