繁体   English   中英

Java中多个线程之间的上下文切换

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM