您好,登錄后才能下訂單哦!
如何用java設(shè)計一個線程池?相信很多新手小白還沒學(xué)會這個技能,通過這篇文章的總結(jié),希望你能學(xué)會用java設(shè)計線程池。如下資料是用java設(shè)計線程池的步驟。
思路與生產(chǎn)者與消費者模式相同,將任務(wù)放到隊列中,子線程再從隊列中取出任務(wù)去執(zhí)行。
方式一:固定線程池,一開始是就申請好線程。
比如:
公司一次性雇傭5個工人,往后在接手任務(wù)還是這5 個人去做。
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class ThreadPoolV1{
private BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10);//隊列容量為10,大于就阻塞等待。
private Thread[] workers = new Thread[5];//線程的個數(shù)即一開始雇傭的工人個數(shù)
ThreadPoolV1() {
for (int i = 0; i < 5; i++) {
workers[i] = new Worker(workQueue);
workers[i].start();//5個線程的啟動 去完成業(yè)務(wù)
}
}
public void execute(Runnable cmd) throws InterruptedException {
workQueue.put(cmd);//將任務(wù)放到隊列中
}
private static class Worker extends Thread {
private BlockingQueue<Runnable> workQueue;
Worker(BlockingQueue<Runnable> queue) {
workQueue = queue;
}
@Override
public void run() {
while (!isInterrupted()) {
try {
Runnable cmd = workQueue.take();//從隊列中把任務(wù)取出來
cmd.run();//業(yè)務(wù)
} catch (InterruptedException e) {
break;
}
}
}
}
public static void main(String[] args) throws InterruptedException {
ThreadPoolV1 pool = new ThreadPoolV1();
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第一個事情");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第二個時期");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第三 個時期");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true)
System.out.println("第四個時期");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第五個時期");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第五個時期");
}
}
});
}
```
方式二:當(dāng)有任務(wù)時雇傭一個工人,再來任務(wù)時再雇傭一個工人,一直這樣,直到雇傭人數(shù)達到預(yù)期最大值,再來任務(wù)就放到隊列中去。
public class ThreadPoolV2 {
private BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10);//隊列上大于10個任務(wù)時,發(fā)生阻塞等待
private int maxThreads = 5;
private int currentThreads = 0;//一開始沒有線程
private Thread[] works = new Thread[maxThreads];
public void execute(Runnable cmd) throws InterruptedException {
if (currentThreads == maxThreads) {//雇傭人數(shù)達到最大值
workQueue.put(cmd);//任務(wù)放到隊列
} else {
Worker worker = new Worker(workQueue);//雇傭一個工人
works[currentThreads++] = worker;
worker.start();
workQueue.put(cmd);
}
}
private static class Worker extends Thread {
private BlockingQueue<Runnable> workQueue;
Worker(BlockingQueue<Runnable> queue) {
workQueue = queue;
}
@Override
public void run() {
while (!isInterrupted()) {
try {
Runnable cmd = workQueue.take();//從
cmd.run();
} catch (InterruptedException e) {
break;
}
}
}
}
}
public static void main(String[] args) throws InterruptedException {
ThreadPoolV1 pool = new ThreadPoolV1();
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第一個事情");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第二個時期");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第三 個時期");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第四個時期");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第五個時期");
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("第六個時期");
}
}
});
}
}
綜上所述,用java設(shè)計線程池有兩種方式,具體使用還要根據(jù)自己情況選擇其中一種方式,如果想了解更多相關(guān)文章內(nèi)容或知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。