java 线程池的理解_JAVA线程池原理的理解
線程池原理基礎(chǔ)理解:
線程池初始化規(guī)定個(gè)數(shù)的線程,然后這些線程一直運(yùn)行,并且監(jiān)控線程隊(duì)列,只要線程隊(duì)列被添加進(jìn)線程,那么線程池不斷從隊(duì)列中取出線程運(yùn)行。直到隊(duì)列中的線程為空。實(shí)例代碼如下:
package?xianchengchi;
/**
*?@author?作者?劉小明
*?@email?ruanjianlxm@sina.com
*?@version?創(chuàng)建時(shí)間:2014年8月16日?下午11:39:53
*?類說明
*/
//測(cè)試線程池
public?class?TestThreadPool?{
public?static?void?main(String[]?args)?{
//?創(chuàng)建3個(gè)線程的線程池
ThreadPool?t?=?ThreadPool.getThreadPool(3);
t.execute(new?Runnable[]?{?new?Task(),?new?Task(),?new?Task(),new?Task(),?new?Task(),?new?Task(),?new?Task(),?new?Task(),?new?Task(),?new?Task(),?new?Task(),?new?Task(),?new?Task()?});
//?t.execute(new?Runnable[]?{?new?Task(),?new?Task(),?new?Task()?});
System.out.println("ttttttttttt__________-"+t);
t.destroy();//?所有線程都執(zhí)行完成才destory
System.out.println(t);
}
//?任務(wù)類
static?class?Task?implements?Runnable?{
private?static?volatile?int?i?=?1;
@Override
public?void?run()?{//?執(zhí)行任務(wù)
System.out.println("任務(wù)?"?+?(i++)?+?"?完成");
}
}
}
package?xianchengchi;
/**
*?@author?作者?劉小明
*?@email?ruanjianlxm@sina.com
*?@version?創(chuàng)建時(shí)間:2014年8月16日?下午11:39:28
*?類說明
*/
import?java.util.LinkedList;
import?java.util.List;
/**
*?線程池類,線程管理器:創(chuàng)建線程,執(zhí)行任務(wù),銷毀線程,獲取線程基本信息
*/
public?final?class?ThreadPool?{
//?線程池中默認(rèn)線程的個(gè)數(shù)為5
private?static?int?worker_num?=?5;
//?工作線程
private?WorkThread[]?workThrads;
//?未處理的任務(wù)
private?static?volatile?int?finished_task?=?0;
//?任務(wù)隊(duì)列,作為一個(gè)緩沖,List線程不安全
private?List?taskQueue?=?new?LinkedList();
private?static?ThreadPool?threadPool;
//?創(chuàng)建具有默認(rèn)線程個(gè)數(shù)的線程池
private?ThreadPool()?{
this(5);
}
//?創(chuàng)建線程池,worker_num為線程池中工作線程的個(gè)數(shù)
private?ThreadPool(int?worker_num)?{
ThreadPool.worker_num?=?worker_num;
workThrads?=?new?WorkThread[worker_num];
for?(int?i?=?0;?i?
workThrads[i]?=?new?WorkThread();
workThrads[i].start();//?開啟線程池中的線程
}
}
//?單態(tài)模式,獲得一個(gè)默認(rèn)線程個(gè)數(shù)的線程池
public?static?ThreadPool?getThreadPool()?{
return?getThreadPool(ThreadPool.worker_num);
}
//?單態(tài)模式,獲得一個(gè)指定線程個(gè)數(shù)的線程池,worker_num(>0)為線程池中工作線程的個(gè)數(shù)
//?worker_num<=0創(chuàng)建默認(rèn)的工作線程個(gè)數(shù)
public?static?ThreadPool?getThreadPool(int?worker_num1)?{
if?(worker_num1?<=?0)
worker_num1?=?ThreadPool.worker_num;
if?(threadPool?==?null)
threadPool?=?new?ThreadPool(worker_num1);
return?threadPool;
}
//?執(zhí)行任務(wù),其實(shí)只是把任務(wù)加入任務(wù)隊(duì)列,什么時(shí)候執(zhí)行有線程池管理器覺定
public?void?execute(Runnable?task)?{
synchronized?(taskQueue)?{
taskQueue.add(task);
taskQueue.notify();
}
}
//?批量執(zhí)行任務(wù),其實(shí)只是把任務(wù)加入任務(wù)隊(duì)列,什么時(shí)候執(zhí)行有線程池管理器覺定
public?void?execute(Runnable[]?task)?{
synchronized?(taskQueue)?{
for?(Runnable?t?:?task)
taskQueue.add(t);
taskQueue.notify();
}
}
/*??//?批量執(zhí)行任務(wù),其實(shí)只是把任務(wù)加入任務(wù)隊(duì)列,什么時(shí)候執(zhí)行有線程池管理器覺定
public?void?execute(List?task)?{
synchronized?(taskQueue)?{
for?(Runnable?t?:?task)
taskQueue.add(t);
taskQueue.notify();
}
}
*/
//?銷毀線程池,該方法保證在所有任務(wù)都完成的情況下才銷毀所有線程,否則等待任務(wù)完成才銷毀
public?void?destroy()?{
while?(!taskQueue.isEmpty())?{//?如果還有任務(wù)沒執(zhí)行完成,就先睡會(huì)吧
try?{
Thread.sleep(10);
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
}
//?工作線程停止工作,且置為null
for?(int?i?=?0;?i?
workThrads[i].stopWorker();
workThrads[i]?=?null;
}
threadPool=null;
taskQueue.clear();//?清空任務(wù)隊(duì)列
System.out.println("銷毀了線程池");
}
//?返回工作線程的個(gè)數(shù)
public?int?getWorkThreadNumber()?{
return?worker_num;
}
//?返回已完成任務(wù)的個(gè)數(shù),這里的已完成是只出了任務(wù)隊(duì)列的任務(wù)個(gè)數(shù),可能該任務(wù)并沒有實(shí)際執(zhí)行完成
public?int?getFinishedTasknumber()?{
return?finished_task;
}
//?返回任務(wù)隊(duì)列的長(zhǎng)度,即還沒處理的任務(wù)個(gè)數(shù)
public?int?getWaitTasknumber()?{
return?taskQueue.size();
}
//?覆蓋toString方法,返回線程池信息:工作線程個(gè)數(shù)和已完成任務(wù)個(gè)數(shù)
@Override
public?String?toString()?{
return?"WorkThread?number:"?+?worker_num?+?"??finished?task?number:"
+?finished_task?+?"??wait?task?number:"?+?getWaitTasknumber();
}
/**
*?內(nèi)部類,工作線程
*/
private?class?WorkThread?extends?Thread?{
//?該工作線程是否有效,用于結(jié)束該工作線程
private?boolean?isRunning?=?true;
/*
*?關(guān)鍵所在啊,如果任務(wù)隊(duì)列不空,則取出任務(wù)執(zhí)行,若任務(wù)隊(duì)列空,則等待
*/
@Override
public?void?run()?{
Runnable?r?=?null;
while?(isRunning)?{//?注意,若線程無效則自然結(jié)束run方法,該線程就沒用了
synchronized?(taskQueue)?{
while?(isRunning?&&?taskQueue.isEmpty())?{//?隊(duì)列為空
try?{
taskQueue.wait(20);
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
}
if?(!taskQueue.isEmpty())
r?=?taskQueue.remove(0);//?取出任務(wù)
}
if?(r?!=?null)?{
r.run();//?執(zhí)行任務(wù)
}
finished_task++;
r?=?null;
}
}
//?停止工作,讓該線程自然執(zhí)行完run方法,自然結(jié)束
public?void?stopWorker()?{
isRunning?=?false;
}
}
}
總結(jié)
以上是生活随笔為你收集整理的java 线程池的理解_JAVA线程池原理的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python增加子类的参数_python
- 下一篇: href 带参数 打开exe_js调用w