先上一段代码spa
public class YieldExcemple { public static void main(String[] args) { Thread threada = new ThreadA(); Thread threadb = new ThreadB(); // 设置优先级:MIN_PRIORITY最低优先级1;NORM_PRIORITY普通优先级5;MAX_PRIORITY最高优先级10 threada.setPriority(Thread.MIN_PRIORITY); threadb.setPriority(Thread.MAX_PRIORITY); threada.start(); threadb.start(); } } class ThreadA extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println("ThreadA--" + i); Thread.yield(); } } } class ThreadB extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println("ThreadB--" + i); Thread.yield(); } } }
本觉得运行结果以下:线程
ThreadB--0 ThreadA--0 ThreadB--1 ThreadA--1 ThreadB--2 ThreadA--2 ThreadB--3 ThreadA--3 ThreadB--4 ThreadA--4 ThreadB--5 ThreadA--5 ThreadB--6 ThreadA--6 ThreadB--7 ThreadA--7 ThreadB--8 ThreadA--8 ThreadB--9 ThreadA--9
结果却出现了多种状况,以下:code
ThreadB--0 ThreadB--1 ThreadB--2 ThreadB--3 ThreadB--4 ThreadB--5 ThreadB--6 ThreadB--7 ThreadB--8 ThreadB--9 ThreadA--0 ThreadA--1 ThreadA--2 ThreadA--3 ThreadA--4 ThreadA--5 ThreadA--6 ThreadA--7 ThreadA--8 ThreadA--9
或者blog
ThreadB--0 ThreadA--0 ThreadB--1 ThreadA--1 ThreadA--2 ThreadA--3 ThreadA--4 ThreadA--5 ThreadA--6 ThreadA--7 ThreadA--8 ThreadA--9 ThreadB--2 ThreadB--3 ThreadB--4 ThreadB--5 ThreadB--6 ThreadB--7 ThreadB--8 ThreadB--9
后翻阅资料得知:it
Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法以后,它就会把本身CPU执行的时间让掉,io
让本身或者其它的线程运行,注意是让本身或者其余线程运行,并非单纯的让给其余线程。class
yield()的做用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具备相同优先级的等待线程获取执行权;可是,并不能保thread
证在当前线程调用yield()以后,其它具备相同优先级的线程就必定能得到执行权;也有多是当前线程又进入到“运行状态”继续运行!yield
举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他忽然说:我不想先上去了,我们你们来竞赛上公交车。而后全部人就一块冲向公交车,方法
有多是其余人先上车了,也有多是Yield先上车了。
可是线程是有优先级的,优先级越高的人,就必定能第一个上车吗?这是不必定的,优先级高的人仅仅只是第一个上车的几率大了一点而已,
最终第一个上车的,也有多是优先级最低的人。而且所谓的优先级执行,是在大量执行次数中才能体现出来的。