A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*
出现问题: 在使用Thread.yield() 后两个线程并未交替运行。

*/

class YieldDemo
{
        public static void main(String[] args)
        {
                Join j = new Join();

                Thread t1 = new Thread(j);
                Thread t2 = new Thread(j);
               
                t1.start();       
                t2.start();       
        }
}
class Join implements Runnable
{       
        public  void run()
        {
                int x=0 ;
                while (x++<50)               
                {
                        System.out.println(Thread.currentThread().toString()+".....run"+x);
                        Thread.yield();                               
                }                                                       
        }
}

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

8 个回复

倒序浏览
上 运行 结果的图

2.png (112.27 KB, 下载次数: 21)

2.png
回复 使用道具 举报
默认情况下,两个线程的执行顺序不一定会交替,也不一定是顺序,而且每次执行的结果可能都不一样,因为线程的执行顺序是由CPU自行去分配的,每个线程都会有一定的机会得到执行权,而执行的时间是不定的,有可能多,也有可能少,现在你看到的是按顺序来执行,可能下一次执行时,就会出现交替的情况。
同学你可以试下,在循环中将循环次数改成 500,你会看到两个线程会出错交替的情况,

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
说一下yield和sleep的区别,楼主应该就明白是怎么回事了。线程中调用sleep方法后,本线程停止(进入阻塞状态),运行权交给其他线程。而线程中调用yield方法后本线程并不停止,运行权由本线程和优先级不低与本线程的线程来抢。也就是说楼主想要通过yield实现两个线程交替是不可能的,还是用sleep靠谱

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
SelonLiao 发表于 2014-10-12 14:26
默认情况下,两个线程的执行顺序不一定会交替,也不一定是顺序,而且每次执行的结果可能都不一样,因为线程 ...

不能控制的话yield有什么意义呢?
回复 使用道具 举报
九零零 发表于 2014-10-12 15:01
说一下yield和sleep的区别,楼主应该就明白是怎么回事了。线程中调用sleep方法后,本线程停止(进入阻塞状态 ...

你的意思是yield 后 本线程仍然有可能抢到执行权?
回复 使用道具 举报
qq8921310 发表于 2014-10-12 15:52
你的意思是yield 后 本线程仍然有可能抢到执行权?

是的,yield不会让线程失去执行资格
回复 使用道具 举报
qq8921310 发表于 2014-10-12 15:51
不能控制的话yield有什么意义呢?

呃,这样说吧,yield()方法是让同优先级的线程有执行的机会。注意:仅仅是让其他线程有执行的机会,但没有说让另一个线程一定要执行, 说白了就是提高另一个线程的执行机率而已,谁知道那个线程能不能抓住这个机会。
同学,可以理解吗?
回复 使用道具 举报
SelonLiao 发表于 2014-10-12 16:23
呃,这样说吧,yield()方法是让同优先级的线程有执行的机会。注意:仅仅是让其他线程有执行的机会,但 ...

3Q    我理解应该是 跟优先级那个类似的吧。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马