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
#5
yield()表示当前线程(running)
愿意放弃cpu,回到runnable状态,但不保证别的线程会得到cpu
jvm在运行时有可能会忽略yield()
即使执行了yield(),当前线程变成可运行状态,但这时它还是会去和别的线程抢cpu
这和优先级没有关系,但优先级相差越大,高优先级的线程越有可能得到cpu
可以看一下这个 http://freish.iteye.com/blog/1477715
java7的文档注释:
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
本来就是静态方法,yield()和Thread.yield()是一样的
#7
你确定?对象不一样,是不是静态方法有啥关系?
#8
你确定?对象不一样,是不是静态方法有啥关系?
Thread.yield();你这样又是新的thread,直接yield()就行了。
本来就是静态方法,yield()和Thread.yield()是一样的
静态方法跟对象本来就没关系,更何况静态方法本来就应该用ClassName.method()的方式调用,obj.method()反而还会带来歧义,大概会收到编译器警告的吧
#9
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
#10
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
#11
不是让别的线程执行 是让出CPU 让所有线程去抢CPU 当然刚刚放弃的线程也是可以抢到的吧
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
#12
只是退出运行状态,但是仍然有可能继续抢到运行权。
#13
不是很懂啊。。。
#14
恩 对。。。 不是让别的线程执行 是让出CPU 让所有线程去抢CPU 当然刚刚放弃的线程也是可以抢到的吧
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
那么yield是不影响代码的执行么???
#15
恩 对。。。 不是让别的线程执行 是让出CPU 让所有线程去抢CPU 当然刚刚放弃的线程也是可以抢到的吧
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
那么yield是不影响代码的执行么???
#16
还没结贴......
给楼主个建议,尽量不要试图控制多个线程的执行顺序。
给楼主个建议,尽量不要试图控制多个线程的执行顺序。
#1
synchronized 去掉看看。
#2
Thread.yield();你这样又是新的thread,直接yield()就行了。
#3
去掉synchronized即可
#4
#5
yield()表示当前线程(running)
愿意放弃cpu,回到runnable状态,但不保证别的线程会得到cpu
jvm在运行时有可能会忽略yield()
即使执行了yield(),当前线程变成可运行状态,但这时它还是会去和别的线程抢cpu
这和优先级没有关系,但优先级相差越大,高优先级的线程越有可能得到cpu
可以看一下这个 http://freish.iteye.com/blog/1477715
java7的文档注释:
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
Thread.yield();你这样又是新的thread,直接yield()就行了。
本来就是静态方法,yield()和Thread.yield()是一样的
#7
Thread.yield();你这样又是新的thread,直接yield()就行了。
本来就是静态方法,yield()和Thread.yield()是一样的
#8
你确定?对象不一样,是不是静态方法有啥关系?
Thread.yield();你这样又是新的thread,直接yield()就行了。
本来就是静态方法,yield()和Thread.yield()是一样的
静态方法跟对象本来就没关系,更何况静态方法本来就应该用ClassName.method()的方式调用,obj.method()反而还会带来歧义,大概会收到编译器警告的吧
#9
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
#10
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
#11
不是让别的线程执行 是让出CPU 让所有线程去抢CPU 当然刚刚放弃的线程也是可以抢到的吧
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
#12
只是退出运行状态,但是仍然有可能继续抢到运行权。
#13
不是很懂啊。。。
#14
恩 对。。。 不是让别的线程执行 是让出CPU 让所有线程去抢CPU 当然刚刚放弃的线程也是可以抢到的吧
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
那么yield是不影响代码的执行么???
#15
恩 对。。。 不是让别的线程执行 是让出CPU 让所有线程去抢CPU 当然刚刚放弃的线程也是可以抢到的吧
yield是 当前正在执行线程让出执行权,让别的线程执行,,,,lz理解有误啊
那么yield是不影响代码的执行么???
#16
还没结贴......
给楼主个建议,尽量不要试图控制多个线程的执行顺序。
给楼主个建议,尽量不要试图控制多个线程的执行顺序。