首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当当前正在执行的线程进入等待状态时,为什么runOn()方法不在池中的下一个可用线程上执行映射操作符?

当当前正在执行的线程进入等待状态时,runOn()方法不在池中的下一个可用线程上执行映射操作符的原因是因为线程池的调度策略和线程的等待状态有关。

线程池是用来管理和调度线程的,它会维护一定数量的线程,当有任务需要执行时,线程池会从池中取出一个可用的线程来执行任务。当一个线程进入等待状态时,它暂时不可用,线程池会将其标记为不可用状态。

在线程池中,有多种调度策略可供选择,如先进先出(FIFO)、最短作业优先(SJF)、优先级调度等。这些策略决定了线程池如何选择下一个可用线程来执行任务。

当当前线程进入等待状态时,线程池会根据调度策略选择下一个可用线程来执行任务。如果runOn()方法是映射操作符,它可能需要在当前线程上执行一些操作,而不是在下一个可用线程上执行。这是因为映射操作符可能需要访问当前线程的上下文或状态,而将其切换到另一个线程可能会导致上下文丢失或状态不一致。

因此,为了保持操作的一致性和正确性,线程池不会将映射操作符切换到下一个可用线程上执行,而是继续在当前线程上执行。这样可以确保映射操作符能够正确地访问当前线程的上下文和状态,避免出现潜在的问题。

需要注意的是,线程池的调度策略和具体实现可能会有所不同,不同的线程池框架可能会有自己的调度策略和行为。因此,在具体的应用场景中,需要根据线程池的实现和配置来确定映射操作符的执行方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Java核心面试宝典】Day14、“线程池”高频面试题总结!✊✊✊

方法sleep作用是使当前线程暂停执行一段时间,让其他线程有机会继续执行方法join作用是阻塞调用该方法线程,直到当前线程执行完毕后,调用该方法线程才能继续执行方法yield作用是暂停当前正在执行线程对象...线程池是一种线程使用模式,创建若干个可执行线程放入一个池(容器)中,有任务需要处理,会提交到线程池中任务队列,处理完后线程并不会被销毁,而是仍然在线程池中等待下一个任务。...提高响应速度,由于线程池中有已经创建线程,因此任务到达可以直接执行。不需要等待线程创建。...: corePoolSize: 核心线程数,定义了最少可以同时运行线程数量,有新任务就会创建一个线程执行任务,线程池中线程数量达到corePoolSize 之后,到达任务进入阻塞队列 maximumPoolSize...keepAliveTime: 等待时间,线程池中线程数量大于 corePoolSize ,如果一个线程空闲时间达到keepAliveTime 则会终止,直到线程池中线程数不超过 corePoolSize

26430

高频多线程&并发面试题(附答案,纯干货)(一)

对于执行很多短期异步任务程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造线程(如果线程可用)。如果现有线程没有可用,则创建一个新线程并添加到池中。...如果在所有线程处于活动状态提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续任务(如果需要)。...4.而调用 wait()方法时候,线程会放弃对象锁,进入等待此对象等待锁定池,只有针对此对象调用 notify()方法后本线程进入对象锁定池准备获取对象锁进入运行状态。...19、Thread类中yield方法有什么作用? Yield方法可以暂停当前正在执行线程对象,让其它有相同优先级线程执行。...它是一个静态方法而且只保证当前线程放弃CPU占用而不能保证使其它线程一定能占用CPU,执行yield()线程有可能在进入到暂停状态后马上又被执行

95220
  • 线程是什么?多线程

    Thread.State状态枚举类: public enum State { /** * 尚未启动,新建 * 使用new操作符创建新线程线程处于...="token comment">/** * 阻塞,线程需要获得对象内置锁,而该锁正在被其他线程拥有 * 正在等待监视器锁定以synchronized同步方法/块,或者调用同步方法...* * 处于等待状态线程正在等待另一个线程执行特定操作。...=5 ) Java虚拟机启动,通常会有一个非守护程序线程(通常调用某个指定类名为 main方法) Java虚拟机继续执行线程直到发生以下任一情况: 已调用类 Runtimeexit方法,并且安全管理器已允许执行退出操作...一个线程池中有多个处于可运行状态线程,当当向线程池中添加Runnable或Callable接口对象,就会有一个线程执行run()或call()方法,如果方法执行完毕,则该线程并不终止,而是继续在池中处于可运行状态

    41620

    你要Java并发面试题都在这里,20000字答案解析

    阻塞状态可分为以下3种: ① 位于对象等待池中阻塞状态(Blocked in object’s wait pool):线程处于运行状态,如果执行了某个对象wait()方法,Java虚拟机就会把线程放到这个对象等待池中...死亡状态(Dead) 线程退出run()方法,就进入死亡状态,该线程结束生命周期。 19、为什么我们调用start()方法时会执行run()方法为什么我们不能直接调用run()方法?...由于一个CPU同一刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态线程。 阻塞态 一条正在执行线程请求某一资源失败,就会进入阻塞态。而在Java中,阻塞态专指请求锁失败进入状态。...一个线程需要调用对象wait()方法时候,这个线程必须拥有该对象锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象notify()方法。...Thread类sleep()和yield()方法将在当前正在执行线程运行。所以在其他处于等待状态线程上调用这些方法是没有意义。这就是为什么这些方法是静态

    46410

    43道多线程面试题,附带答案(二)

    线程调用了对象 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒线程便会进入该对象池中,锁池中线程会去竞争该对象锁...yield方法可以暂停当前正在执行线程对象,让其它有相同优先级线程执行。...Thread类sleep()和yield()方法将在当前正在执行线程运行。 该代码只有在某个A线程执行时会被执行,这种情况下通知某个B线程yield是无意义(因为B线程本来就没在执行)。...29.为什么你应该在循环中检查等待条件? 处于等待状态线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件情况下退出。...这两个附加操作是:在队列为空,获取元素线程等待队列变为非空。队列满,存储元素线程等待队列可用

    59520

    43道多线程面试题,附带答案(二)

    线程调用了对象 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒线程便会进入该对象池中,锁池中线程会去竞争该对象锁...yield方法可以暂停当前正在执行线程对象,让其它有相同优先级线程执行。...Thread类sleep()和yield()方法将在当前正在执行线程运行。 该代码只有在某个A线程执行时会被执行,这种情况下通知某个B线程yield是无意义(因为B线程本来就没在执行)。...29.为什么你应该在循环中检查等待条件? 处于等待状态线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件情况下退出。...这两个附加操作是:在队列为空,获取元素线程等待队列变为非空。队列满,存储元素线程等待队列可用

    76800

    Java多线程

    直到线程进入就绪状态,才有机会转到运行状态。阻塞情况分三种: (一)、等待阻塞:运行线程执行wait()方法,JVM会把该线程放入等待池中。...sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕线程重新转入就绪状态。 5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。...4、线程让步:Thread.yield() 方法,暂停当前正在执行线程对象,把执行机会让给相同或者更高优先级线程。 5、线程加入:join()方法等待其他线程终止。...线程通过调用其中一个 wait 方法,在对象监视器上等待。 直到当前线程放弃此对象锁定,才能继续执行被唤醒线程。...wait()方法,它就进入到一个和该对象相关等待池中,同时失去(释放)了对象机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问; wait(

    92520

    2018跳槽面试必备之深入理解 Java 多线程核心知识

    创建状态 当用 new 操作符创建一个新线程对象,该线程处于创建状态。 处于创建状态线程只是一个空线程对象,系统不为它分配资源。...不可运行状态 发生下列事件,处于运行状态线程会转入到不可运行状态: 调用了 sleep() 方法线程调用 wait() 方法等待特定条件满足; 线程输入/输出阻塞; 返回可运行状态; 处于睡眠状态线程在指定时间过去后...但是,如果发生以下情况,就会终止线程运行: 线程体中调用了 yield() 方法,让出了对 CPU 占用权; 线程体中调用了 sleep() 方法,使线程进入睡眠状态线程由于 I/O 操作而受阻塞...默认情况下,在创建了线程池后,线程池中线程数为0,有任务来之后,就会创建一个线程执行任务,线程池中线程数目达到 corePoolSize 后,就会把到达任务放到缓存队列当中。...默认情况下,只有当线程池中线程数大于 corePoolSize ,keepAliveTime 才会起作用,直到线程池中线程数不大于 corePoolSize,即线程池中线程数大于 corePoolSize

    34430

    线程池解析

    SHUTDOWN,调用shutdown()方法进入状态,表示不在接受新任务,处理阻塞队列中任务undefined 2.3....TIDYING, 所有的任务已终止,ctl记录”任务数量”为0,线程池会变为TIDYING状态线程池变为TIDYING状态,会执行钩子函数terminated()。...进入具体执行流程: 判断当前线程池中线程数量是否小于核心线程数,如果小于则将创建工作线程Woker执行任务,否则继续进行判断当前线程池是否处于运行状态,如果运行则将当前任务加入阻塞队列(这里注意...for(;;)进入执行进行状态检查,然后进入第二个for(;;)使用CAS方式将线程池中线程数量加1 , wc >= (core ?...方法(),首先进行解锁,这时候如果调用shutdown方法的话是允许被中断,然后进入while循环判断当前任务是否为空如果为空则从任务队列中取元素,获取Woker锁,获取到之后进入任务具体执行如果调用

    47220

    Java并发编程73道面试题及答案 —— 面试稳了

    阻塞状态可分为以下3种: ① 位于对象等待池中阻塞状态(Blocked in object’s wait pool):线程处于运行状态,如果执行了某个对象wait()方法,Java虚拟机就会把线程放到这个对象等待池中...由于一个CPU同一刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态线程。 阻塞态 一条正在执行线程请求某一资源失败,就会进入阻塞态。而在Java中,阻塞态专指请求锁失败进入状态。...进入等待线程会释放CPU执行权,并释放资源(如:锁) 超时等待运行中线程调用sleep(time)、wait、join、parkNanos、parkUntil,就会进入状态;它和等待态一样...一个线程需要调用对象wait()方法时候,这个线程必须拥有该对象锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象notify()方法。...Thread类sleep()和yield()方法将在当前正在执行线程运行。所以在其他处于等待状态线程上调用这些方法是没有意义。这就是为什么这些方法是静态

    41520

    一文搞定Java并发编程面试考点

    阻塞状态可分为以下3种: ① 位于对象等待池中阻塞状态(Blocked in object’s wait pool):线程处于运行状态,如果执行了某个对象wait()方法,Java虚拟机就会把线程放到这个对象等待池中...由于一个CPU同一刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态线程。 阻塞态 一条正在执行线程请求某一资源失败,就会进入阻塞态。而在Java中,阻塞态专指请求锁失败进入状态。...进入等待线程会释放CPU执行权,并释放资源(如:锁) 超时等待运行中线程调用sleep(time)、wait、join、parkNanos、parkUntil,就会进入状态;它和等待态一样...一个线程需要调用对象wait()方法时候,这个线程必须拥有该对象锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象notify()方法。...Thread类sleep()和yield()方法将在当前正在执行线程运行。所以在其他处于等待状态线程上调用这些方法是没有意义。这就是为什么这些方法是静态

    36010

    一文搞定Java并发编程面试考点

    阻塞状态可分为以下3种: ① 位于对象等待池中阻塞状态(Blocked in object’s wait pool):线程处于运行状态,如果执行了某个对象wait()方法,Java虚拟机就会把线程放到这个对象等待池中...由于一个CPU同一刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态线程。 阻塞态 一条正在执行线程请求某一资源失败,就会进入阻塞态。而在Java中,阻塞态专指请求锁失败进入状态。...进入等待线程会释放CPU执行权,并释放资源(如:锁) 超时等待运行中线程调用sleep(time)、wait、join、parkNanos、parkUntil,就会进入状态;它和等待态一样...一个线程需要调用对象wait()方法时候,这个线程必须拥有该对象锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象notify()方法。...Thread类sleep()和yield()方法将在当前正在执行线程运行。所以在其他处于等待状态线程上调用这些方法是没有意义。这就是为什么这些方法是静态

    39710

    Java并发编程73道面试题及答案——稳了

    阻塞状态可分为以下3种: ① 位于对象等待池中阻塞状态(Blocked in object’s wait pool):线程处于运行状态,如果执行了某个对象wait()方法,Java虚拟机就会把线程放到这个对象等待池中...由于一个CPU同一刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态线程。 阻塞态 一条正在执行线程请求某一资源失败,就会进入阻塞态。而在Java中,阻塞态专指请求锁失败进入状态。...进入等待线程会释放CPU执行权,并释放资源(如:锁) 超时等待运行中线程调用sleep(time)、wait、join、parkNanos、parkUntil,就会进入状态;它和等待态一样...一个线程需要调用对象wait()方法时候,这个线程必须拥有该对象锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象notify()方法。...Thread类sleep()和yield()方法将在当前正在执行线程运行。所以在其他处于等待状态线程上调用这些方法是没有意义。这就是为什么这些方法是静态

    39620

    2022 最新 Java 并发编程 面试题(一)

    阻塞状态可分为以下 3 种: 位于对象等待池中阻塞状态( Blocked in object’ s wait pool) : 线程处于运行状态, 如果执行了某个对象 wait()方法, Java...由于一个 CPU 同一刻只能执行一 条线程, 因此每个 CPU 每个时刻只有一条运行态线程。 阻塞态 一条正在执行线程请求某一资源失败, 就会进入阻塞态。...一个线程需要调用对象 wait()方法时候 ,这 个线程必须拥有该对象锁 ,接 着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象 notify() 方法 。...71、为什么 Thread 类 sleep()和 yield ()方法是静态? Thread 类 sleep()和 yield()方法将在当前正在执行线程运行。...所以在其他 处于等待状态线程上调用这些方法是没有意义。 这就是为什么这些方法是静 态。 它们可以在当前正在执行线程中工作, 并避免程序员错误认为可以在 其他非运行线程调用这些方法

    12810

    Java 并发编程 71 道面试题及答案

    阻塞队列是一个支持两个附加操作队列。在队列为空,获取元素线程等待队列变为非空。队列满,存储元素线程等待队列可用。...由于一个CPU同一刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态线程。 阻塞态: 一条正在执行线程请求某一资源失败,就会进入阻塞态。...进入等待线程会释放CPU执行权,并释放资源(如:锁) 超时等待态: 运行中线程调用sleep(time)、wait、join、parkNanos、parkUntil,就会进入状态;它和等待态一样...一个线程需要调用对象wait()方法时候,这个线程必须拥有该对象锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象notify()方法。...Thread类sleep()和yield()方法将在当前正在执行线程运行。所以在其他处于等待状态线程上调用这些方法是没有意义。这就是为什么这些方法是静态

    49332

    稳了!Java并发编程71道面试题及答案

    阻塞队列是一个支持两个附加操作队列。在队列为空,获取元素线程等待队列变为非空。队列满,存储元素线程等待队列可用。...由于一个CPU同一刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态线程。 阻塞态: 一条正在执行线程请求某一资源失败,就会进入阻塞态。...进入等待线程会释放CPU执行权,并释放资源(如:锁) 超时等待态: 运行中线程调用sleep(time)、wait、join、parkNanos、parkUntil,就会进入状态;它和等待态一样...一个线程需要调用对象wait()方法时候,这个线程必须拥有该对象锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象notify()方法。...Thread类sleep()和yield()方法将在当前正在执行线程运行。所以在其他处于等待状态线程上调用这些方法是没有意义。这就是为什么这些方法是静态

    42420

    Java 面试宝典!并发编程 71 道题及答案全送上!

    阻塞队列是一个支持两个附加操作队列。在队列为空,获取元素线程等待队列变为非空。队列满,存储元素线程等待队列可用。...由于一个CPU同一刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态线程。 阻塞态: 一条正在执行线程请求某一资源失败,就会进入阻塞态。...进入等待线程会释放CPU执行权,并释放资源(如:锁) 超时等待态: 运行中线程调用sleep(time)、wait、join、parkNanos、parkUntil,就会进入状态;它和等待态一样...一个线程需要调用对象wait()方法时候,这个线程必须拥有该对象锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象notify()方法。...Thread类sleep()和yield()方法将在当前正在执行线程运行。所以在其他处于等待状态线程上调用这些方法是没有意义。这就是为什么这些方法是静态

    42820

    2021 面试还不知道如何优雅关闭Java线程

    一个爬虫任务 发生错误时(例如,磁盘空间已满),那么所有搜索任务都会取消,此时可能会记录它们的当前状态,以便稍后重新启动 关闭 一个程序或服务关闭,必须对正在处理和等待处理工作执行某种操作。...在编写任务和服务可以使用这样协作:需要停止,首先会清除当前正在执行工作,然后再结束。这提供了更好灵活性,因为任务本身代码比发出取消请求代码更清楚如何执行清理工作。...大多数可中断阻塞方法会在入口处检查中断状态。 对中断操作(调用interrupt)正确理解 它并不会真正中断一个正在运行线程,而只是发出中断请求,然后由线程下一个合适时机中断自己。...线程执行shutdown()后,就会拒绝接收新任务,但会等待线程池中正在执行任务和已进入阻塞队列任务,都执行完后才最终关闭线程池。...shutdownNow()相对激进,线程执行shutdownNow()后,会拒绝接收新任务,同时中断线程池中正在执行任务,已进入阻塞队列任务也会被剥夺了执行机会,不过这些被剥夺执行机会任务会作为

    58930

    Java 多线程 从无到有

    它保持这个状态直到程序 start() 这个线程。 · 就绪状态: 线程对象调用了start()方法之后,该线程进入就绪状态。就绪状态线程处于就绪队列中,要等待JVM里线程调度器调度。...直到线程进入就绪状态,才有机会转到运行状态。阻塞情况分三种: (一)、等待阻塞:运行线程执行wait()方法,JVM会把该线程放入等待池中。...sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕线程重新转入就绪状态。 5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。...直到当前线程放弃此对象锁定,才能继续执行被唤醒线程。被唤醒线程将以常规方式与在该对象主动同步其他所有线程进行竞争;例如,唤醒线程在作为锁定此对象下一个线程方面没有可靠特权或劣势。...线程让步: Thread.yield() 方法,暂停当前正在执行线程对象,把执行机会让给相同或者更高优先级线程。 九.

    81250

    wait方法和sleep方法区别

    抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行。        有多个线程访问共享数据时候,就需要对线程进行同步。...Wait()方法和notify()方法一个线程执行到wait()方法,它就进入到一个和该对象相关等待池中,同时失去了对象机锁。...它被一个notify()方法唤醒等待池中线程就被放到了锁池中。该线程从锁池中获得机锁,然后回到wait()前中断现场。...join()方法使当前线程停下来等待,直至另一个调用join方法线程终止。 值得注意是:线程在被激活后不一定马上就运行,而是进入到可运行线程队列中。...对某一线程调用interrupt(),如果该线程正在执行普通代码,那么该线程根本就不会抛出InterruptedException。

    1K50
    领券