重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
java 打造阻塞式線程池的實(shí)例詳解
我們提供的服務(wù)有:網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、荔城ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的荔城網(wǎng)站制作公司
原來以為tiger已經(jīng)自帶了這種線程池,就是在任務(wù)數(shù)量超出時(shí)能夠阻塞住投放任務(wù)的線程,主要想用在JMS消息監(jiān)聽。
開始做法:
在ThreadPoolExcecutor中代入new ArrayBlockingQueue(MAX_TASK).在任務(wù)超出時(shí)報(bào)錯(cuò):RejectedExecutionException。
后來不用execute方法加入任務(wù),直接getQueue().add(task), 利用其阻塞特性。但是發(fā)現(xiàn)阻塞好用了,但是任務(wù)沒有被處理。一看Queue,暈啊,原來都在里面,任務(wù)池就沒處理它。看樣還是要走任務(wù)池。
最后自己重載了一個(gè)BlockedThreadPoolExecutor:
private ReentrantLock pauseLock = new ReentrantLock(); private Condition unpaused = pauseLock.newCondition(); @Override public void execute(Runnable command) { pauseLock.lock(); try { while (getPoolSize()==getMaximumPoolSize() && getQueue().remainingCapacity()==0) unpaused.await(); super.execute(command);//放到lock外面的話,在壓力測(cè)試下會(huì)有漏網(wǎng)的! } catch (InterruptedException e) { log.warn(this, e); } finally { pauseLock.unlock(); } } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r,t); try{ pauseLock.lock(); unpaused.signal(); }finally{ pauseLock.unlock(); } }
多線程程序很容易出錯(cuò),寫好了要拼命的用壓力測(cè)試,否則問題多多啊~~~
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論!