黑马程序员技术交流社区

标题: 线程的yield()这个方法,请大神指教下 [打印本页]

作者: 丁永志    时间: 2013-7-15 23:03
标题: 线程的yield()这个方法,请大神指教下
本帖最后由 杨兴庭 于 2013-7-16 21:16 编辑
  1. class Runn1 implements Runnable
  2. {
  3. public void run()
  4. {
  5. for (int i = 0;i<100 ;i++ )
  6. {
  7. System.out.print("*");
  8. Thread.yield();
  9. }
  10. }
  11. }
  12. class Runn2 implements Runnable
  13. {
  14. public void run()
  15. {
  16. for (int i = 0;i<100 ;i++ )
  17. {
  18. System.out.print("+");
  19. Thread.yield();
  20. }
  21. }
  22. }
  23. public class RunnTest2
  24. {
  25. public static void main(String [] args)
  26. {
  27. Runn1 r1 = new Runn1();
  28. Runn2 r2 = new Runn2();
  29. Thread t1 = new Thread(r1);
  30. Thread t2 = new Thread(r2);
  31. t1.start();
  32. t2.start();
  33. }
  34. }
复制代码
为什么运行的结果不是*+*+ 这样有规律的 而运行的结果为什么是没有规律的?

作者: 杨增坤    时间: 2013-7-15 23:48
System.out.print("+");
Thread.yield();

System.out.print("*");
Thread.yield();
没有保证是一起执行的,有可能是执行了这一句System.out.print("+");后,被另一个线程抢占了CPU,执行System.out.print("*"); Thread.yield();
  另一个线程获得执行权,继续执行;System.out.print("*"); 这样就 +**,这样的字符串,所以不是交替执行的,可以考虑用锁来限制。
作者: 张云杰    时间: 2013-7-16 02:40
这个是交替运行吧..  表示是说 一个方法执行完的结果,然后执行到yield的时候, 线程会被放弃掉 接下去由另外一个线程执行
作者: qq553046803    时间: 2013-7-16 07:14
可以考虑在方法哪里加个synchronized保证执行过程中不会执行其他线程上!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2