线程中的yield()方法????

yangliyun2008 2008-03-26 04:40:42
public class Thread4 extends Thread{

public Thread4() {
}
public void run(){
for(int i=1;i<=10;i++){
System.out.println(getName()+":"+i);
yield(); //x1
try{
sleep(1000);
}catch(InterruptedException ie){}
}
}
public static void main(String[] args) {
Thread4 t1=new Thread4();
Thread4 t2=new Thread4();
t1.start();
t2.start();
}

}
通过几次运行以上程序发现 yield()有无好象对程序的执行结果和效率没什么影响.
我知道 yield()方法使当前运行的线程对象退出运行状态,使其他线程得以运行.
请高手指点一下有无yield()方法的区别在哪里???谢谢了
...全文
267 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
johnsoncr 2008-03-27
  • 打赏
  • 举报
回复
调用sleep(long millionseconds)可以保证该线程在millionseconds内得不到运行
调用yield,只能说是给其它线程一次公平竟争的机会,调用了该方法后,谁会得到执行这是不确定的.
yangliyun2008 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qingyuan18 的回复:]
yield会放弃该线程所占的资源,sleep会继续持有CPU等资源,这就是根本的不同
[/Quote]
可是什么时候该用yield什么时候该用sleep呢?
qingyuan18 2008-03-26
  • 打赏
  • 举报
回复
yield会放弃该线程所占的资源,sleep会继续持有CPU等资源,这就是根本的不同
yangliyun2008 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Johnson_Hong 的回复:]
线程在执行到yield()后就会让步,然后另外的线程就会执行
建议你这样就可以看到区别了
public class Thread4 extends Thread{

public Thread4() {
}
public void run(){
for(int i=1;i <=10;i++){
System.out.println(getName()+":"+i+"前");
yield(); //x1
System.out.println(getName()+":"+i+"中");

[/Quote]
你的程序我运行过了,发现线程在执行yield()后也有可能还执行这个线程,正如2楼说的那样.可是我却不明白sleep()与yield()的区别了?
nihuajie05 2008-03-26
  • 打赏
  • 举报
回复
我说下我的理解吧
yeild只是让出CPU,避免贪婪线程抢占CPU
但是yeild之后就不能保证其执行顺序了..跟sleep一样
yangliyun2008 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 johnsoncr 的回复:]
yield方法是暂停当前进程,然后线程调度程序从线程池里面再选一个线程出来运行.
哪一个线程会被选中是不确定的,所以这并不保证刚暂停的线程不会再次被选出来运行.
[/Quote]
如果没有yield方法的话,当t1与t2都sleep结束后,会先执行哪个线程呢?是不是也不确定呢?我运行了几次,好象是这样的.
这使我更加不明白了.不知道我哪儿理解错了???再请高手指点.
yangliyun2008 2008-03-26
  • 打赏
  • 举报
回复
哦,原来是这样啊,不过我确实发成功了,我会等着您的邮件的,再确认一下,您收到我的 E-mail 消息了吗
  • 打赏
  • 举报
回复
但是你的再回信我没有收到啊
  • 打赏
  • 举报
回复
我明天给你发 E-mail 回信。
yangliyun2008 2008-03-26
  • 打赏
  • 举报
回复
哦,信我收到了,我在等您信中说的电子邮件啊,不是说您有两个资源问我要不要,要的话就把我的Email发给你,我已经发了我的 Email了,一直在等待您的邮件呢
  • 打赏
  • 举报
回复
你移到我的 ID 上“发消息”给我告诉我你的 E-mail 吧。
  • 打赏
  • 举报
回复
不会吧
yangliyun2008 2008-03-26
  • 打赏
  • 举报
回复
火果龙,不知道你现在还在不在,我没有收到
Tayita 2008-03-26
  • 打赏
  • 举报
回复
3楼代码很清楚,打印出结果很能说明问题,学习到了
  • 打赏
  • 举报
回复
点 http://hi.csdn.net/my.html 这个链接

在你的名字下看看是否有 “您有X条未读私信”点那个数字就可以了。
  • 打赏
  • 举报
回复
小小草,我在 3 月 22 日就给你回信了,你没有收到?
hjxaut 2008-03-26
  • 打赏
  • 举报
回复
不知道LZ希望得到什么样的结果?
Johnson_Hong 2008-03-26
  • 打赏
  • 举报
回复
线程在执行到yield()后就会让步,然后另外的线程就会执行
建议你这样就可以看到区别了
public class Thread4 extends Thread{

public Thread4() {
}
public void run(){
for(int i=1;i <=10;i++){
System.out.println(getName()+":"+i+"前");
yield(); //x1
System.out.println(getName()+":"+i+"中");
try{
sleep(1000);
}catch(InterruptedException ie){}
System.out.println(getName()+":"+i+"后");
}
}
public static void main(String[] args) {
Thread4 t1=new Thread4();
Thread4 t2=new Thread4();
t1.start();
t2.start();
}

}
johnsoncr 2008-03-26
  • 打赏
  • 举报
回复
yield方法是暂停当前进程,然后线程调度程序从线程池里面再选一个线程出来运行.
哪一个线程会被选中是不确定的,所以这并不保证刚暂停的线程不会再次被选出来运行.
Tayita 2008-03-26
  • 打赏
  • 举报
回复
学习,等高人解答

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧