java 线程协作 yield()
yield():方法的定义
调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。 但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会 (Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程, cpu会从众多的可执行态里选择.),优先级高的线程业不一定会获得执行权,他们只是概率上大些。该方法不会释放锁。
注意:调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间(也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,
并不是说一定会执行其他线程而该线程在下一次中不会执行到了)。
示例:交出当前cpu的执行权,与其他线程一起重新获取cpu的调度
public class ThreadYieldTest {
static Object object=new Object();
public static void main(String[] args) {
Thread thread_a=new Thread(new Thread_a());
Thread thread_b=new Thread(new Thread_b());
thread_a.setPriority(Thread.MIN_PRIORITY); //Min Priority
thread_b.setPriority(Thread.MAX_PRIORITY); //Max Priority
thread_a.start();
thread_b.start();
}
}
class Thread_a implements Runnable{
@Override
public void run() {
try {
for(int i=0;i<5;i++){
//当i为3时,该线程就会把CPU时间让掉,让其他或者自己的线程执行(也就是谁先抢到谁执行)
if(i==3){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"执行==》"+i);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Thread_b implements Runnable{
@Override
public void run() {
try {
for(int i=0;i<5;i++){
if(i==3){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"执行==》"+i);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
第一种情况:Thread-0 当执行到3时会CPU时间让掉,这时Thread-1抢到CPU时间并执行。
第二种情况:Thread-0 当执行到3时会CPU时间让掉,这时Thread-0抢到CPU时间并执行。
示例:它跟sleep方法类似,同样不会释放锁。
public class ThreadYieldTest {
static Object object=new Object();
public static void main(String[] args) {
Thread thread_a=new Thread(new Thread_a());
Thread thread_b=new Thread(new Thread_b());
thread_a.setPriority(Thread.MIN_PRIORITY); //Min Priority
thread_b.setPriority(Thread.MAX_PRIORITY); //Max Priority
thread_a.start();
thread_b.start();
}
}
class Thread_a implements Runnable{
@Override
public void run() {
try {
synchronized (ThreadYieldTest.object) {
System.out.println("进入线程"+Thread.currentThread().getName());
for(int i=0;i<5;i++){
//当i为3时,该线程就会把CPU时间让掉,让其他或者自己的线程执行(也就是谁先抢到谁执行)
if(i==3){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"执行==》"+i);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Thread_b implements Runnable{
@Override
public void run() {
try {
synchronized (ThreadYieldTest.object) {
System.out.println("进入线程"+Thread.currentThread().getName());
for(int i=0;i<5;i++){
if(i==3){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"执行==》"+i);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果:无论如何重复执行,一个线程只能等另一个线程执行完后才能执行。
java 线程协作 yield()的更多相关文章
- Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- java 线程协作 wait(等待)与 notiy(通知)
一.wait().notify()和notifyAll() 为了更好的支持多线程之间的协作,JDK提供了三个重要的本地方法 //调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对 ...
- java线程中yield(),sleep(),wait()区别详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- Java线程中yield()的用法
Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程.(可能没有效果) yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会.因此, ...
- java 线程协作 join()
在实际开发中我们往往会遇到这样的情况一个线程的执行需要依赖另一个线程执行后的结果.即主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他 ...
- 【Java并发专题之三】Java线程互斥、协作原理
(I)Java线程互斥原理之synchronized原理 从JDK5引入CAS原子操作,但没有对synchronized关键字做优化,而是增加了J.U.C.concurrent,concurrent包 ...
- Java线程小刀牛试
线程简介 什么是线程 现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器.堆栈和局部变量等属性,并且 ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
java线程存在以下几种状态: 1: 创建状态(New):线程被new出来,还未调用start 2: 就绪状态(Runnable):又称为可执行状态,调用线程的start方法后,线程处于就绪状态,,线 ...
随机推荐
- session和cookie的简单理解
0. 引子,我们为什么要cookie和session 因为http请求是无状态的(不能记录用户的登录状态等),所以需要某种机制来保存用户的登录状态等信息,在下次访问web服务的时候,不用再 ...
- 如何使用yum下载rpm包
一.使用 yum-downloadonly 插件 参考文章:ghosTzone 的博客http://ghostm55.is-programmer.com/posts/6422.html yum是一个优 ...
- switch的经典引用
#include<stdio.h> int main(void) { int i; do{ printf("按1,流量查询\n"); printf("按2,人 ...
- eclipse js 引用跳转
引用 http://stackoverflow.com/questions/24505993/the-resource-is-not-on-the-build-path-of-a-javascript ...
- 动画总结(UIView的动画)
Main.storyboard ViewController.m // // ViewController.m // 8A08.动画总结 // // Created by huan on 16/ ...
- MongoDB学习笔记—02 MongoDB入门
Mongodb的基本概念 文档:是MongoDB中数据的基本单元,类似于关系型数据库中的行. 集合:多个文档组成一个集合,类似于关系型数据库中的表. 数据库:MongoDB的当个实例可以容纳多个独立的 ...
- BNUOJ 51279[组队活动 Large](cdq分治+FFT)
传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
- javascript练习-方法借用
方法借用其实也可以叫做多重继承 var generic = { //返回一个字符串,这个字符串包含构造函数的名字(如果构造函数包含名字) //这个以及所有非继承来的,非函数属性的名字和值 toStri ...
- NetBIOS与Winsock编程接口
最近在看网络编程方面的书,由于不是通信专业出身的,以前理解的网络体系感觉就是tcp/ip,最近工作上接触到了一些光环网等乱七八糟的东西,有些基本的LC.SC连接器都不认识.花时间看了下计算机网络体系结 ...
- SqlServer2012 数据库的同步之SQL JOB + 建立链接服务器
文章参考百度过的文章,现在忘了具体哪篇,感谢其分享,这里根据自己的操作和遇到的问题整理一下. 需求:在两个不同的SQL SERVER 2012的服务器之间进行数据访问和更新.我们需 ...