当前位置: 首页 > news >正文

【Java】yield()和join()区别

一、java 线程调度的背景

java虚拟机要求在多线程中实现 preemptivepriority-based调度,这意味着java中每一个线程被分配了特定的优先级,正整数在定义好的范围内不断减。优先级可以通过开发者改变但是java虚拟机从不改变线程的优先级,即使线程已经运行了一段时间。

优先级的值很重要,因为这是java虚拟机和底部的操作系统的契约,操作系统必须选择一个最高优先级的java线程运行。这就是我们平时讲的java实现了一个priority-based的调度。调度的实现使用的是preemptive方式,也就是说高优先级的线程来到之后,不管低优先级的线程是否运行线程都会中断。然而和操作系统间的契约并不是绝对的,操作系统也可以选择低优先级的线程运行

二、线程的优先级

  • 在不指定的情况下,所有的线程的优先级都是正常的。
  • 优先级的范围从11010是最高优先级,1是最低优先级,5是正常优先级。
  • 最高优先级的线程有执行的趋向,但是不能保证这一线程一定会在它开始的时候执行。
  • 当前执行的线程和线程池中等待的线程相比或许有比较高的优先级。
  • 线程调度决定哪个线程执行。
  • setPriority()方法可以被用来设置线程的优先级。
  • 线程的优先级应该在start()方法调用之前被设置。
  • 你可以使用常量MIN_PRIORITYMAX_PRIORITYNORM_PRIORITY来设置优先级

三、yield方法

理论上讲,yield的意思是松开,放弃或者是屈服。一个yield的线程告诉虚拟机它允许其他的线程被调度它现在所在的位置,这意味着它没有严格的做一些事情。注意这只是一个线索,没有保证什么事情。yield()调用后线程进入就绪状态

Thread.javayield是这样定义的

/*** A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore* this hint. Yield is a heuristic attempt to improve relative progression between threads that would otherwise over-utilize a CPU.* Its use should be combined with detailed profiling and benchmarking to ensure that it actually has the desired effect.*/public static native void yield();

1、yield的是静态方法也是native方法
2、yield告诉正在执行的线程给线程池中有相同优先级的线程一个机会
3、yield不能保证正在执行的线程立刻变成Runnable状态
4、它仅仅可以使一个线程从running状态变成Runnable状态,而不是wait或者blocked状态

四、join()方法

线程实例的join()方法可以被用来join到线程执行的开始和其他线程执行的结束,所以直到其他线程运行结束这个线程才会执行。如果join的方法在线程实例中被调用,当前运行的线程会被堵塞,直到线程实例运行完成。

//Waits for this thread to die.public final void join() throws InterruptedException

join方法中设定超时,可以设定在指定的时间内无效。当超时到达,主线程和任务线程都可能被执行,但是,因为有sleepjoin需要根据OS的时间规定来执行,所以你不应该假定线程和你指定的时间是一样的,和sleep一样,Join相应中断。

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
这就是一个很小但是很重要的概念的全部。

http://www.lryc.cn/news/13312.html

相关文章:

  • 【MySQL】Java连接MySQL数据库(封装版只需会MySQL)
  • 【java基础】运算符
  • 带噪学习-概述
  • Scratch少儿编程案例-多彩打地鼠
  • 为什么拔掉计算机网线还能ping通127.0.0.1?
  • Android kotlin 内、外部存储根目录及测试(可以实现仿微信未读消息数提示数字)
  • Android 7.0 OTA升级(高通)
  • 工作负载之DeployMent
  • 淘宝tmall页面数据获取,API接口对接程序
  • 基于粒子群优化算法的电动汽车充放电V2G研究(Matlab代码实现)
  • java并发编程原理2 (AQS, ReentrantLock,线程池)
  • 研报精选230219
  • 【PPPoE】PPPoE拨号流程
  • django项目实战(django+bootstrap实现增删改查)
  • Lesson4---Python语言基础(2)
  • NCHW - NHWC - CHWN 排列
  • 2019蓝桥杯真题矩阵切割(填空题) C语言/C++
  • Java线程池的创建以及原理
  • Java集合学习之Map
  • java 基于maven多模块合并打包部署
  • Kubernetes是个什么东东?
  • 【go语言grpc之client端源码分析三】
  • Android 基础知识4-2.6LinearLayout(线性布局)
  • 补充前端面试题(三)
  • .net开发安卓入门-自动升级(配合.net6 webapi 作为服务端)
  • 分享111个HTML艺术时尚模板,总有一款适合您
  • spring之Spring AOP基于注解
  • LeetCode题目笔记——6362. 合并两个二维数组 - 求和法
  • 【C#基础】C# 常用语句讲解
  • 腾讯云——负载均衡CLB