关于线程中yield的用法

时间:2022-10-02 23:31:40
public class FirstThread extends Thread{	
public synchronized  void run(){
for(int i=0;i<5;i++){
System.out.println("第一个线程"+(i+1)+"次运行");
}
}
}
public class SecThread extends Thread{
public synchronized void run(){
Thread.yield();
for(int i=0;i<5;i++){

System.out.println("第二个线程"+(i+1)+"次运行");

}
}

}
public class Test {
public static void main(String[] args) {

FirstThread mt =new FirstThread();
SecThread mnt = new SecThread();
mt.setPriority(6);
mt.start();
mnt.start();

}

}

yield不是让高于自己的线程抢到吗,怎么不是输出的顺序呢不固定啊

16 个解决方案

#1


synchronized  去掉看看。

#2


Thread.yield();你这样又是新的thread,直接yield()就行了。

#3


去掉synchronized即可

#4


该回复于2014-04-25 13:39:21被管理员删除

#5


yield()表示当前线程(running) 愿意放弃cpu,回到runnable状态,但不保证别的线程会得到cpu
jvm在运行时有可能会忽略yield()
即使执行了yield(),当前线程变成可运行状态,但这时它还是会去和别的线程抢cpu
这和优先级没有关系,但优先级相差越大,高优先级的线程越有可能得到cpu

可以看一下这个 http://freish.iteye.com/blog/1477715
java7的文档注释:

    /**
     * A hint to the scheduler that the current thread is willing to yield
     * its current use of a processor. The scheduler is free to ignore this
     * hint.
     *
     * <p> Yield is a heuristic attempt to improve relative progression
     * between threads that would otherwise over-utilise a CPU. Its use
     * should be combined with detailed profiling and benchmarking to
     * ensure that it actually has the desired effect.
     *
     * <p> It is rarely appropriate to use this method. It may be useful
     * for debugging or testing purposes, where it may help to reproduce
     * bugs due to race conditions. It may also be useful when designing
     * concurrency control constructs such as the ones in the
     * {@link java.util.concurrent.locks} package.
     */
    public static native void yield();

#6


引用 2 楼 fangmingshijie 的回复:
Thread.yield();你这样又是新的thread,直接yield()就行了。

本来就是静态方法,yield()和Thread.yield()是一样的

#7


引用 6 楼 waynexuan 的回复:
Quote: 引用 2 楼 fangmingshijie 的回复:

Thread.yield();你这样又是新的thread,直接yield()就行了。

本来就是静态方法,yield()和Thread.yield()是一样的
你确定?对象不一样,是不是静态方法有啥关系?

#8


引用 7 楼 fangmingshijie 的回复:
Quote: 引用 6 楼 waynexuan 的回复:

Quote: 引用 2 楼 fangmingshijie 的回复:

Thread.yield();你这样又是新的thread,直接yield()就行了。

本来就是静态方法,yield()和Thread.yield()是一样的
你确定?对象不一样,是不是静态方法有啥关系?


静态方法跟对象本来就没关系,更何况静态方法本来就应该用ClassName.method()的方式调用,obj.method()反而还会带来歧义,大概会收到编译器警告的吧

#9


 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法

#10


引用 9 楼 zhouren1314 的回复:
 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法
不是让别的线程执行   是让出CPU  让所有线程去抢CPU  当然刚刚放弃的线程也是可以抢到的吧

#11


引用 10 楼 u014039623 的回复:
Quote: 引用 9 楼 zhouren1314 的回复:

 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法
不是让别的线程执行   是让出CPU  让所有线程去抢CPU  当然刚刚放弃的线程也是可以抢到的吧
恩 对。。。

#12


只是退出运行状态,但是仍然有可能继续抢到运行权。

#13


不是很懂啊。。。

#14


引用 11 楼 zhouren1314 的回复:
Quote: 引用 10 楼 u014039623 的回复:

Quote: 引用 9 楼 zhouren1314 的回复:

 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法
不是让别的线程执行   是让出CPU  让所有线程去抢CPU  当然刚刚放弃的线程也是可以抢到的吧
恩 对。。。

那么yield是不影响代码的执行么???

#15


引用 14 楼 yankaiwuzhengbo 的回复:
Quote: 引用 11 楼 zhouren1314 的回复:

Quote: 引用 10 楼 u014039623 的回复:

Quote: 引用 9 楼 zhouren1314 的回复:

 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法
不是让别的线程执行   是让出CPU  让所有线程去抢CPU  当然刚刚放弃的线程也是可以抢到的吧
恩 对。。。

那么yield是不影响代码的执行么???
没有看懂你的意思。。

#16


还没结贴......
给楼主个建议,尽量不要试图控制多个线程的执行顺序。

#1


synchronized  去掉看看。

#2


Thread.yield();你这样又是新的thread,直接yield()就行了。

#3


去掉synchronized即可

#4


该回复于2014-04-25 13:39:21被管理员删除

#5


yield()表示当前线程(running) 愿意放弃cpu,回到runnable状态,但不保证别的线程会得到cpu
jvm在运行时有可能会忽略yield()
即使执行了yield(),当前线程变成可运行状态,但这时它还是会去和别的线程抢cpu
这和优先级没有关系,但优先级相差越大,高优先级的线程越有可能得到cpu

可以看一下这个 http://freish.iteye.com/blog/1477715
java7的文档注释:

    /**
     * A hint to the scheduler that the current thread is willing to yield
     * its current use of a processor. The scheduler is free to ignore this
     * hint.
     *
     * <p> Yield is a heuristic attempt to improve relative progression
     * between threads that would otherwise over-utilise a CPU. Its use
     * should be combined with detailed profiling and benchmarking to
     * ensure that it actually has the desired effect.
     *
     * <p> It is rarely appropriate to use this method. It may be useful
     * for debugging or testing purposes, where it may help to reproduce
     * bugs due to race conditions. It may also be useful when designing
     * concurrency control constructs such as the ones in the
     * {@link java.util.concurrent.locks} package.
     */
    public static native void yield();

#6


引用 2 楼 fangmingshijie 的回复:
Thread.yield();你这样又是新的thread,直接yield()就行了。

本来就是静态方法,yield()和Thread.yield()是一样的

#7


引用 6 楼 waynexuan 的回复:
Quote: 引用 2 楼 fangmingshijie 的回复:

Thread.yield();你这样又是新的thread,直接yield()就行了。

本来就是静态方法,yield()和Thread.yield()是一样的
你确定?对象不一样,是不是静态方法有啥关系?

#8


引用 7 楼 fangmingshijie 的回复:
Quote: 引用 6 楼 waynexuan 的回复:

Quote: 引用 2 楼 fangmingshijie 的回复:

Thread.yield();你这样又是新的thread,直接yield()就行了。

本来就是静态方法,yield()和Thread.yield()是一样的
你确定?对象不一样,是不是静态方法有啥关系?


静态方法跟对象本来就没关系,更何况静态方法本来就应该用ClassName.method()的方式调用,obj.method()反而还会带来歧义,大概会收到编译器警告的吧

#9


 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法

#10


引用 9 楼 zhouren1314 的回复:
 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法
不是让别的线程执行   是让出CPU  让所有线程去抢CPU  当然刚刚放弃的线程也是可以抢到的吧

#11


引用 10 楼 u014039623 的回复:
Quote: 引用 9 楼 zhouren1314 的回复:

 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法
不是让别的线程执行   是让出CPU  让所有线程去抢CPU  当然刚刚放弃的线程也是可以抢到的吧
恩 对。。。

#12


只是退出运行状态,但是仍然有可能继续抢到运行权。

#13


不是很懂啊。。。

#14


引用 11 楼 zhouren1314 的回复:
Quote: 引用 10 楼 u014039623 的回复:

Quote: 引用 9 楼 zhouren1314 的回复:

 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法
不是让别的线程执行   是让出CPU  让所有线程去抢CPU  当然刚刚放弃的线程也是可以抢到的吧
恩 对。。。

那么yield是不影响代码的执行么???

#15


引用 14 楼 yankaiwuzhengbo 的回复:
Quote: 引用 11 楼 zhouren1314 的回复:

Quote: 引用 10 楼 u014039623 的回复:

Quote: 引用 9 楼 zhouren1314 的回复:

 yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊 关于线程中yield的用法
不是让别的线程执行   是让出CPU  让所有线程去抢CPU  当然刚刚放弃的线程也是可以抢到的吧
恩 对。。。

那么yield是不影响代码的执行么???
没有看懂你的意思。。

#16


还没结贴......
给楼主个建议,尽量不要试图控制多个线程的执行顺序。

相关文章