多线程 -- yield()方法和sleep()方法的区别

来源:互联网 发布:php ruby perl python 编辑:程序博客网 时间:2024/06/06 04:26


yiled()方法,指线程1让步后,它把机会让给了同等优先级的线程,由操作系统选择接下来要执行的线程,可能是线程1,也可能是其他线程。线程1的状态转换如下:

Runnng --> Runable(就绪状态)

sleep(),指让线程1休息给定的时间。只要休息的时间够长,且有其他线程已经处于就绪状态,那么接下来要执行的线程肯定不会是线程1。线程1的状态转换如下:

Running --> Blocked(阻塞状态) --> Runnable(就绪状态)


一.执行yiled()方法

public class Two_Thread implements Runnable {public static void main(String[] args) {// TODO Auto-generated method stubTwo_Thread R = new Two_Thread();for(int i=0;i<3;i++){Thread t1 = new Thread(R);t1.start(); //通过start()方法启动线程}//System.out.println(Thread.currentThread().getName()+" back to main");}@Overridepublic void run() {// TODO Auto-generated method stubincreate();}private  void increate() { // TODO Auto-generated method stubfor(int i=0;i<5;i++){System.out.println(Thread.currentThread().getName()+" i = "+i);     Thread.yield();    }}}

打印出来的其中一种log:

Thread-0 i = 0
Thread-2 i = 0
Thread-1 i = 0
Thread-2 i = 1
Thread-0 i = 1
Thread-2 i = 2
Thread-1 i = 1
Thread-2 i = 3
Thread-0 i = 2
Thread-2 i = 4
Thread-1 i = 2
Thread-1 i = 3
Thread-1 i = 4
Thread-0 i = 3
Thread-0 i = 4


由log我们可以看出,运行了线程Thread-1( 即打印i=2),然后让步,接下来还是运行线程Thread-1 (即打印i=3)。

Thread-1 i = 2
Thread-1 i = 3
Thread-1 i = 4



二.执行sleep()方法

public class Two_Thread implements Runnable {public static void main(String[] args) {// TODO Auto-generated method stubTwo_Thread R = new Two_Thread();for(int i=0;i<3;i++){Thread t1 = new Thread(R);t1.start(); //通过start()方法启动线程}//System.out.println(Thread.currentThread().getName()+" back to main");}@Overridepublic void run() {// TODO Auto-generated method stubincreate();}private  void increate() { // TODO Auto-generated method stubfor(int i=0;i<5;i++){System.out.println(Thread.currentThread().getName()+" i = "+i);      try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }    }}}



打印出来的log是: 其中i的值肯定是 000 111 222 333 444

Thread-0 i = 0
Thread-1 i = 0
Thread-2 i = 0
Thread-0 i = 1
Thread-1 i = 1
Thread-2 i = 1
Thread-0 i = 2
Thread-1 i = 2
Thread-2 i = 2
Thread-0 i = 3
Thread-2 i = 3
Thread-1 i = 3
Thread-0 i = 4
Thread-2 i = 4
Thread-1 i = 4


由log我们可以看出,运行了线程Thread-1,只要休眠时间够长且有其他线程就绪,接下来肯定不会再运行线程Thread-1

0 0
原创粉丝点击