多线程事例:yield
多线程例子:yield
执行结果是:
yield本意是让步,但是看这个结果,似乎并没有起到什么效果。起码是看不出来有什么用处。
事实上,Thread中yield()是让当前线程暂停,交出CPU,转入可运行状态,让系统的线程调度器重新调度一次。再次调度时,哪个线程都有可能被调度。
yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。
public class Test { public static void main(String[] args) { Thread t1 = new MyThread1(); Thread t2 = new Thread(new MyRunnable()); t2.start(); t1.start(); } } class MyThread1 extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println("线程1第" + i + "次执行!"); // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } } } class MyRunnable implements Runnable { public void run() { for (int i = 0; i < 10; i++) { System.out.println("线程2第" + i + "次执行!"); Thread.yield(); } } }
执行结果是:
线程2第0次执行! 线程1第0次执行! 线程2第1次执行! 线程1第1次执行! 线程2第2次执行! 线程1第2次执行! 线程2第3次执行! 线程1第3次执行! 线程2第4次执行! 线程1第4次执行! 线程2第5次执行! 线程1第5次执行! 线程2第6次执行! 线程2第7次执行! 线程2第8次执行! 线程1第6次执行! 线程2第9次执行! 线程1第7次执行! 线程1第8次执行! 线程1第9次执行!
yield本意是让步,但是看这个结果,似乎并没有起到什么效果。起码是看不出来有什么用处。
事实上,Thread中yield()是让当前线程暂停,交出CPU,转入可运行状态,让系统的线程调度器重新调度一次。再次调度时,哪个线程都有可能被调度。
yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。