线程池与任何ExecutorServices一样,我们定义了一个大小为3的newFixedPool。现在我有一个大约10000个可运行任务的队列。对于执行上述过程,我有这些疑问-
>
要执行上述过程,执行者是否只允许来自任务queus的3个线程一次运行?
池将携带3个线程,这3个线程将只负责执行所有10000个任务。如果正确,单个线程如何运行不同的可运行任务,因为最终这些任务也是线程本身,并且在任何作业/任务的运行过程中,您可以为池线程分配新的职责。
下面是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;
}
}
>
是的,如果实际上使用的是执行器,那么池中最多一次只有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没有