如何用java设计一个线程池

如何用java设计一个线程池?相信很多新手小白还没学会这个技能,通过这篇文章的总结,希望你能学会用java设计线程池。如下资料是用java设计线程池的步骤。

创新互联专业为企业提供天坛街道网站建设、天坛街道做网站、天坛街道网站设计、天坛街道网站制作等企业网站建设、网页设计与制作、天坛街道企业网站模板建站服务,10多年天坛街道做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

思路与生产者与消费者模式相同,将任务放到队列中,子线程再从队列中取出任务去执行。

方式一:固定线程池,一开始是就申请好线程。
比如:
公司一次性雇佣5个工人,往后在接手任务还是这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];//线程的个数即一开始雇佣的工人个数
    ThreadPoolV1() {
        for (int i = 0; i < 5; i++) {
            workers[i] = new Worker(workQueue);
            workers[i].start();//5个线程的启动 去完成业务
        }
    }
    public void execute(Runnable cmd) throws InterruptedException {
        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("第五个时期");
                }
            }
        });
                }
    ```

方式二:当有任务时雇佣一个工人,再来任务时再雇佣一个工人,一直这样,直到雇佣人数达到预期最大值,再来任务就放到队列中去。

public class ThreadPoolV2 {
    private BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10);//队列上大于10个任务时,发生阻塞等待
    private int maxThreads = 5;
    private int currentThreads = 0;//一开始没有线程
    private Thread[] works = new Thread[maxThreads];
    public void execute(Runnable cmd) throws InterruptedException {
        if (currentThreads == maxThreads) {//雇佣人数达到最大值
            workQueue.put(cmd);//任务放到队列
        } 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设计线程池有两种方式,具体使用还要根据自己情况选择其中一种方式,如果想了解更多相关文章内容或知识,欢迎关注创新互联行业资讯频道。

网站题目:如何用java设计一个线程池
当前路径:https://www.cdcxhl.com/article26/jochjg.html

成都网站建设公司_创新互联,为您提供网站收录动态网站网站策划企业建站标签优化外贸网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站建设网站维护公司