Java 什么是';执行(可运行命令)';执行人的方法到底是什么? private ExecutorService executor1=Executors.newFixedThreadPool(5); 对于(int i=0;i
线程是在您创建新的固定线程池时创建的,但是这些线程还没有做任何事情。它们正在等待任务执行 当您告诉固定线程池执行器执行一个Java 什么是';执行(可运行命令)';执行人的方法到底是什么? private ExecutorService executor1=Executors.newFixedThreadPool(5); 对于(int i=0;i,java,Java,线程是在您创建新的固定线程池时创建的,但是这些线程还没有做任何事情。它们正在等待任务执行 当您告诉固定线程池执行器执行一个Runnable时,该Runnable将被发送到其中一个空闲线程,然后该线程将开始与您的程序执行并行运行。当Runnable终止时,完成的线程将再次处于待机状态,并等待进一步的工作 当池中的所有线程都忙时,告诉执行器服务执行可运行程序时,这些可运行程序将被放入队列,并在可运行程序完成时执行。执行器消息将执行您在不同线程中指定的可运行程序 private ExecutorSer
Runnable
时,该Runnable将被发送到其中一个空闲线程,然后该线程将开始与您的程序执行并行运行。当Runnable
终止时,完成的线程将再次处于待机状态,并等待进一步的工作
当池中的所有线程都忙时,告诉执行器服务执行可运行程序时,这些可运行程序将被放入队列,并在可运行程序完成时执行。执行器消息将执行您在不同线程中指定的可运行程序
private ExecutorService executor1 = Executors.newFixedThreadPool(5);
for(int i=0;i<10;i++)
executor1.execute(some runnable command);
表示您正在创建一个执行器对象,其线程池中有5个线程。因此,每当有请求传入时,它将使用这5个线程中的一个线程来执行该请求
private ExecutorService executor1 = Executors.newFixedThreadPool(5);
for(inti=0;i查看ThreadPoolExecutor.execute()方法的源代码
方法1:检查线程池大小和池运行状态
for(int i=0;i<10;i++)
executor1.execute(some runnable command);
方法2:
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
if (runState == RUNNING && workQueue.offer(command)) {
if (runState != RUNNING || poolSize == 0)
ensureQueuedTaskHandled(command);
}
else if (!addIfUnderMaximumPoolSize(command))
reject(command); // is shutdown or saturated
}
}
我认为它完全按照所说的做…在将来的某个时间执行给定的命令。该命令可能在新线程、池线程或调用线程中执行,具体取决于执行器实现。因此,当线程3完成任务并返回池时,它将处于什么状态?我的意思是,当线程3执行时另一个要执行的任务是否重新启动?那么,当线程3完成一个任务并返回池时,它将处于什么状态?我的意思是,当线程3执行另一个任务时,它是否重新启动?是的,当线程完成其任务时,它将返回池。如果执行者有任何挂起的计划任务,它将选择free线程池中的线程,并使用它运行挂起的计划任务。
private void ensureQueuedTaskHandled(Runnable command) {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
boolean reject = false;
Thread t = null;
try {
int state = runState;
if (state != RUNNING && workQueue.remove(command))
reject = true;
else if (state < STOP &&
poolSize < Math.max(corePoolSize, 1) &&
!workQueue.isEmpty())
t = addThread(null);
} finally {
mainLock.unlock();
}
if (reject)
reject(command);
else if (t != null)
t.start();
}
private Thread addThread(Runnable firstTask) {
Worker w = new Worker(firstTask);
Thread t = threadFactory.newThread(w);
if (t != null) {
w.thread = t;
workers.add(w);
int nt = ++poolSize;
if (nt > largestPoolSize)
largestPoolSize = nt;
}
return t;
}