2016-02-09 4 views
0

Что представляет собой контекстное переключение? Я знаю, что это может быть иногда с помощью sleep(). Я наткнулся на пример, используя комбинацию wait() и notify() для выполнения межпоточной связи, так что один поток (класса Producer) поставляет набор данных, а затем ждет, пока другой поток (класса Consumer) не будет потреблен Это.Контекст Переключение между несколькими потоками в Java

Мой вопрос касается влияния на производительность, когда утверждается, что «процессор тратит больше времени на переключение контекста и меньшее время на выполнение фактической работы». Но, глядя на этот пример, я думаю, что переключение контекста происходит только тогда, когда ЦП завершает необходимый набор операций. Тогда какова логика вышеприведенного цитируемого заявления? Пожалуйста, найдите прилагаемый пример (Courtesy: Осборн Полная ссылка 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."); 
    } 
} 
+1

http://stackoverflow.com/questions/18964050/context-switching-in-java –

+0

Коммутатор контекста - это загрузочная и разгрузочная память каждого потока, а не ваш собственный контекст в коде –

+0

. У вас есть этот код из книга? похоже, что он был написан кем-то, кто не знает, как использовать wait/notify. –

ответ

0

отходы CPU больше времени делать переключения контекста и меньше времени делает фактическую работу.

Это происходит потому, что во время переключения контекста ядра ОС должно сохранить состояние регистров процессора для текущего потока, а затем загрузить эти регистры правильного состояния для следующего потока, который находится рядом должны быть выполнено. Это дополнительная работа, которую ядро ​​должно выполнять во время переключения контекста, не связанного с кодом приложения.

Другим побочным эффектом этого является то, что мы теряем местность ссылок из-за контекстного переключателя.

Смежные вопросы