[英]Context Switching among multiple threads in Java
什么是上下文切换? 我知道可以通过有时使用sleep()来实现。 我遇到了一个结合使用wait()和notify()进行线程间通信的示例,以便(生产者类的)一个线程提供数据集,然后等待直到(消费者类的)另一个线程消耗完数据它。
我的问题是关于性能的问题,在这种争论中,“ CPU在进行上下文切换时浪费了更多时间,而在实际工作中却浪费了时间”。 但是看这个例子,我认为上下文切换仅在CPU完成所需的操作集时发生。 那么上述引用语句背后的逻辑是什么? 请找到随附的示例(由Osborne提供的完整参考Java)。
/*An implementation of a producer and consumer.*/
class Q {
int n;
boolean valueSet = false;
synchronized int get() {
if(!valueSet)
try {
wait();
} catch(InterruptedException e) {
System.out.println("InterruptedException caught");
}
System.out.println("Got: " + n);
valueSet = false;
notify();
return n;
}
synchronized void put(int n) {
if(valueSet)
try {
wait();
} catch(InterruptedException e) {
System.out.println("InterruptedException caught");
}
this.n = n;
valueSet = true;
System.out.println("Put: " + n);
notify();
}
}
class Producer implements Runnable {
Q q;
Producer(Q q) {
this.q = q;
new Thread(this, "Producer").start();
}
public void run() {
int i = 0;
while(true) {
q.put(i++);
}
}
}
class Consumer implements Runnable {
Q q;
Consumer(Q q) {
this.q = q;
new Thread(this, "Consumer").start();
}
public void run() {
while(true) {
q.get();
}
}
}
class PCFixed {
public static void main(String args[]) {
Q q = new Q();
new Producer(q);
new Consumer(q);
System.out.println("Press Control-C to stop.");
}
}
CPU在进行上下文切换时浪费了更多时间,而在进行实际工作时则浪费了更少的时间。
这是因为,在上下文切换期间,OS内核必须为当前线程保存cpu寄存器的状态,然后为下一个要执行的下一个线程以正确的状态加载这些寄存器。 这是内核在上下文切换期间与应用程序代码无关的一项额外工作。
这样做的另一个副作用是,由于上下文切换,我们失去了引用的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.