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;
}