有关Thread.yield()方法的一些问题。我所理解的是当我们调用Thread.Yield()时,当前正在运行的线程将返回到runnable状态。依赖于线程优先级线程调度程序将执行下一个更高优先级的线程。现在我有一个示例程序。请参阅下文。
package thread;
public class YieldTest implements Runnable {
@Override
public synchronized void run() {
System.out.println(Thread.currentThread().getName()+", executing..");
for(int i = 0 ; i <5;i++){
if(i==2){
Thread.yield();
System.out.println(Thread.currentThread().getName()+": "+i+" yielded()");
/*try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+": "+i+" yielded()");
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}else{
System.out.println(Thread.currentThread().getName()+": "+i);
}
}
}
public static void main(String[] args) {
YieldTest test = new YieldTest();
Thread t1 = new Thread(test);
t1.setName("A");
t1.setPriority(9);
Thread t2 = new Thread(test);
t2.setName("B");
Thread t3 = new Thread(test);
t3.setName("C");
t2.setPriority(6);
t2.setPriority(4);
t1.start();
t2.start();
t3.start();
}
}
这里我总是按以下方式获取输出,
A, executing..
A: 0
A: 1
A: 2 yielded()
A: 3
A: 4
C, executing..
C: 0
C: 1
C: 2 yielded()
C: 3
C: 4
B, executing..
B: 0
B: 1
B: 2 yielded()
B: 3
B: 4
现在问题是yield()方法应该回到可运行状态,其他线程应该执行。所以输出应该类似于以下方式
A,执行.. 答:0 答:1 答:2屈指()
C,执行.. C:0 C:1 C:2得出()
A: 3
A: 4
B,执行.. B:0 B:1 B:2得到()
C: 3
C: 4
B: 3
B: 4
另外,线程优先级怎么样?难道不保证为什么我们需要线程优先级?请纠正我如果我错了。
答案 0 :(得分:2)
所有运行方法都在同一个对象上进行同步(测试)。因此,屈服不起任何作用,因为直到第一个线程的run方法退出,没有其他人可以进入他们的run()方法。
基本上线程1启动,并进入run()方法。这与'this'同步。在输出2个数字后,它会产生。但是线程2和3都在等待进入run方法,因为它们无法在测试时获得监视器。所以产量不会做任何事情。一旦完成第一个线程,就会发生同样的问题。
答案 1 :(得分:2)
当Java使用绿色线程时,产量更有用。现在,虽然它将通知操作系统,但线程可以处于等待状态(不可运行)。但是,操作系统和JVM真的要决定线程是否实际允许另一个线程运行。那个线程是你无法控制的。
但是,最终我从未使用任何产量。你想用它做什么?
答案 2 :(得分:1)
你是对的,不保证线程优先级。这只是对JVM的建议,JVM在决定实际运行哪个线程时可以查看其他因素。从技术上讲,JVM甚至可以随意选择,如果需要的话,仍然符合the JVM specification。
答案 3 :(得分:0)
Thread.yield:这是一个静态方法,主要用于通知系统当前线程愿意“放弃CPU”一段时间。
线程调度程序可以选择要运行的其他线程而不是当前线程。
但是,线程调度程序如何实现让步的细节因平台而异。一般来说,你不应该依赖它以特定的方式行事。不同的事情包括:
1.when, after yielding, the thread will get an opportunity to run again;
2.whether or not the thread forgoes its remaining quantum.
主题优先级:
在任何给定时间,优先级最高的线程都在运行。但是,这不能保证。线程调度程序可以选择运行较低优先级的线程以避免饥饿。因此,出于效率目的,仅将优先级用于影响调度策略。
答案 4 :(得分:0)
恕我直言尝试用Java编写自己的调度程序并不是一个好主意。不太可能以你想象的方式提供帮助或行为。