2012-03-16 4 views
0

Некоторые вопросы, касающиеся метода Thread.yield(). То, что я понял, когда мы вызываем, Thread.Yield(), текущий поток будет возвращаться в состояние runnable. Поэтому в зависимости от потока нити планировщик потоков выполняет следующий поток с более высоким приоритетом. Теперь у меня есть одна примерная программа. См. Ниже.некоторые сомнения относительно yield()

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 

Теперь вопрос метод доходности() должен вернуться в runable состояние и другой поток должен выполнить. поэтому выход должен быть чем-то вроде следующим образом

A, выполнение .. А: 0 А: 1 А: 2 получают()

С, выполнение .. C: 0 C: 1 С: 2 дали()

A: 3 
A: 4 

В, выполнение .. Б: 0 Б: 1 Б: 2 получают()

C: 3 
C: 4 

B: 3 
B: 4 

Кроме того, что касается приоритета потока. Не гарантировано, почему нам нужен приоритет потока? Пожалуйста, исправьте меня, если я ошибаюсь.

+0

Какую проблему вы действительно пытаетесь решить? Вызов 'yield()', вероятно, не лучшее решение. –

+0

Подробнее о 'yield()' см. [Этот вопрос] (http://stackoverflow.com/questions/5156985/how-does-method-yield-work). – Pops

+0

В этом конкретном случае я не удивлюсь, если поток А, завершенный до того, как B успел начать. – pap

ответ

2

Все ваши методы запуска синхронизируются на одном объекте (тест). Таким образом, уступчивость ничего не делает, так как до тех пор, пока не будет запущен метод запуска первого потока, никто другой не сможет ввести методы run().

В основном поток 1 запускается и вводит метод run(). Это синхронизируется на «этом». После вывода 2 чисел это дает. Но потоки 2 и 3 ждут ввода метода run, так как они не могут получить монитор при тестировании. Так что выход ничего не делает. Такая же проблема возникает после завершения потока.

+0

Хорошо, спасибо за хорошую информацию. Если он не синхронизирован, то мы не можем достичь результата свойства, такого как oe thread после одного потока таким образом. – user414967

1

Вы правы, приоритет нитей не гарантируется. Это просто предложение JVM, и JVM может смотреть на другие факторы при выборе того, какой поток фактически выполняется. Технически, JVM может даже выбирать наугад, если это так желает, и по-прежнему соответствовать the JVM specification.

2

Таким образом, выход был более полезен, когда Java использовала Green Threading. Теперь, пока он будет уведомлять ОС, поток может быть помещен в состояние ожидания (НЕ запускается). Но на самом деле это зависит от ОС и JVM от того, действительно ли поток даст возможность запускать другой поток. И какой поток, который есть, находится вне вашего контроля.

Но, в конечном счете, я никогда не использовал урожай ни для чего. В чем вы пытаетесь его использовать?

+0

, поэтому мы никогда не должны использовать или избегать использования Thread.yield(), поскольку он зависит исключительно от платформы и JVM. Это верно? Вместо Yield() лучше использовать wait(). я прав? – user414967

+0

Проблема не в переносимости, а в контроле. У вас недостаточно контроля, используя выход для любой синхронизации между потоками. Я не могу придумать проблему, которая позволит решить проблему. Проблема с вашим вопросом заключается в том, что вы спросили о выходе, но на самом деле не сказали, почему вы считаете, что вам нужна урожайность. Использование wait/notify/notifyAll и синхронизация, чтобы иметь полный контроль, но опять же есть другие способы, которые обычно проще. Это просто сводится к тому, что вы пытаетесь сделать? – chubbsondubs

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. 

Приоритета темы:

В любом данный момент времени, наивысочайший приоритет поток работает. Однако это не гарантируется. Планировщик потоков может выбрать запуск потока с более низким приоритетом, чтобы избежать голодания. По этой причине используйте приоритет, чтобы влиять на политику планирования для эффективности.

0

Thread.yield() как приоритеты потоков - это всего лишь предложения для ОС. Нет гарантии, что yield() остановит текущий поток. Это не гарантирует, что поток с более высоким приоритетом будет запущен в этот момент, поскольку ОС может остановить ваш поток в любом месте. Нет гарантии, что поток с более высоким приоритетом будет иметь более высокий приоритет, иначе это будет иметь значение, если это произойдет.

IMHO Неплохо пытаться написать собственный планировщик на Java. Очень маловероятно, чтобы помочь или вести себя так, как вы думаете.

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