溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何用java設(shè)計一個線程池

發(fā)布時間:2020-06-03 14:45:13 來源:億速云 閱讀:236 作者:Leah 欄目:編程語言

如何用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è)資訊頻道。


向AI問一下細節(jié)

免責(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)容。

AI