当前位置: 首页 > 知识库问答 >
问题:

Java中的线程池到底在做什么?

赖鸿羲
2023-03-14

线程池与任何ExecutorServices一样,我们定义了一个大小为3的newFixedPool。现在我有一个大约10000个可运行任务的队列。对于执行上述过程,我有这些疑问-

>

  • 执行上述过程,执行者是否只允许来自任务queus的3个线程一次运行?

    池将携带3个线程,这3个线程将只负责执行所有10000个任务。如果正确,单个线程如何运行不同的可运行任务,因为最终这些任务也是线程本身,并且在任何作业/任务的运行过程中,您可以为池线程分配新的职责。

  • 共有2个答案

    白信鸿
    2023-03-14

    下面是java中接受noofThreads和MaxConcurrentTask的customThreadPool。它还有stop()来停止整个线程池

    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    
    
    @SuppressWarnings("all")
    public class ThreadPool { 
    
    
        private BlockingQueue taskQueue = null;  
        private List<PoolThread> threads = new ArrayList<PoolThread>(); 
        private boolean isStopped = false; 
    
        public ThreadPool(int noOfThreads, int maxNoOfTasks) { 
            taskQueue = new LinkedBlockingQueue(maxNoOfTasks);
            for(int i=0; i<noOfThreads; i++) {    
                threads.add(new PoolThread(taskQueue));  
            }   
    
            for(PoolThread thread : threads) {    
                thread.start();  
            }  
        }  
    
        public synchronized void execute(Runnable task) {  
    
            if(this.isStopped) 
                throw  new IllegalStateException("ThreadPool is stopped");
    
            this.taskQueue.offer(task); 
        }  
    
        public synchronized void stop() {  
            this.isStopped = true;  
            for(PoolThread thread : threads)    {     
                thread.stopMe();   
            } 
        }
    }
    
    
    @SuppressWarnings("all")
    class PoolThread extends Thread { 
    
        private BlockingQueue taskQueue = null; 
        private boolean       isStopped = false; 
        public PoolThread(BlockingQueue queue)  { 
            taskQueue = queue; 
        } 
    
        public void run()   {   
            while(!isStopped()) {   
                try {    
                    Runnable runnable = (Runnable) taskQueue.poll();  
                    runnable.run();     
                } catch(Exception e)    {    
                    //log or otherwise report exception,        //but keep pool thread alive.  
    
                }    
            } 
        } 
    
        public synchronized void stopMe()   {  
            isStopped = true;   
            this.interrupt(); 
            //break pool thread out of dequeue() call. 
        }  
    
        public synchronized boolean isStopped() {  
            return isStopped;  
        }
    }
    
    洪华皓
    2023-03-14

    >

  • 是的,如果实际上使用的是执行器,那么池中最多一次只有3个线程。newFixedThreadPool(3)

    这10,000个任务不是线程,它们只是Runnables。必须通过Thread#start启动线程才能实际创建系统线程。任务(Runnable的实例)被放置在BlockingQueue中。线程池中的线程将轮询BlockingQueue以查找要运行的任务。当它们完成任务时,它们返回队列以获取另一个。如果添加了更多任务,则根据该队列的实现规则将它们插入BlockingQueue。对于大多数队列,这是先进先出,但PriorityQueue实际上使用比较器或自然排序来对插入的任务进行排序。

  •  类似资料:
    • 问题内容: 线程池有什么用?现实世界中有一个很好的例子吗? 问题答案: 线程池是最初创建的一组线程,它们等待作业并执行它们。这个想法是让线程始终存在,这样我们就不必每次都花时间来创建它们。当我们知道有大量工作要处理时,它们是合适的,即使可能有一段时间没有工作。 这是Wikipedia的一个不错的图表:

    • 问题内容: 我在Python文档的FileObjects中找到了这个: flush()不一定会将文件的数据写入磁盘。使用flush()和os.fsync()来确保此行为。 所以我的问题是:Python到底在做什么?我以为这会强制将数据写入磁盘,但现在我知道并没有。为什么? 问题答案: 通常涉及两个级别的缓冲: 内部缓冲器 操作系统缓冲区 内部缓冲区是由您要针对其进行编程的运行时/库/语言创建的缓冲

    • 问题内容: 当我使用Express二进制文件创建示例Express应用程序时,引导代码包含以下几行: 我对app.router的了解不多。我以为这是处理路由(app.get(),app.post()等)规则的中间件,但是当我删除app.use(app.router)时,这些规则也会执行。线。 那么,该中间件的确切用途是什么? 问题答案: 这来自Express 2.x指南http://express

    • 问题内容: 在Tour of Go网站的go 1.5发行之前的版本中,有一段代码看起来像这样。 输出看起来像这样: 令我困扰的是,将其删除后,该程序不再显示“世界”。 为什么呢?如何影响执行力? 问题答案: 注意: 从Go 1.5开始,将GOMAXPROCS设置为硬件内核数:golang.org/doc/go1.5#runtime,低于1.5之前的原始答案。 当您在未指定GOMAXPROCS环境变

    • 根据几个因素(包括OS/浏览器组合),WebDriver可能等待或不等待页面加载。在某些情况下,WebDriver可能会在页面完成加载或甚至开始加载之前返回控制 有人能解释一下在什么情况下WebDriver会在页面完成甚至开始加载之前返回控制吗?

    • 我有一个Spring Boot后端,我刚刚解决了从Angular frontend上传文件时的“ERR_CONNECTION_RESET”问题,方法是配置Tomcat属性。我想弄清楚它到底是做什么的。Tomcat文档对我来说并不明显: 对于中止的上载,Tomcat将吞下的最大请求主体字节数(不包括传输编码开销)。中止上载是指Tomcat知道请求正文将被忽略,但客户端仍然发送它。如果Tomcat没有