2011-06-15 1 views
2
Class Producer implements Runnable 
    Q q; 

    Producer(Q q) { 
     this.q = q; // line- 5 
     new Thread(this, "Producer").start(); 
    } 
    public void run(){ 
     int i = 0; 
     while(true){ 
     q.put(i++); 
     } 
    } 
} 

Эй, пожалуйста, скажите мне: 1. На строке 5, в которой они находятся? 2. Почему в строке 6 объект не создается? Непосредственно вызывается функция запуска? ...Программа Interthread Communication

+0

Это, вероятно, хороший способ убить вашу систему. В зависимости от того, как это реализовано, q.put(), вероятно, создаст один или два объекта для каждого вызова, чтобы ваши потоки GC были максимальными. Поведение по умолчанию - использовать все ядра в вашей системе для этого. Если у вас очень быстрые потребители, у вас наверняка будет нехватка памяти, которая, по крайней мере, остановит производителя. –

ответ

0

Строка 5 - переменная экземпляра q имеет значение, равное значению q, переданному конструктору Producers.

Линия 6 - Создана новая тема. Он возвращает себя из конструктора и сразу же вызывается метод start.

+0

в функции main() записывается новый Продюсер (q) {где q - объект Q). Теперь мой вопрос в том, в чем разница между this.q и q? это используется для ссылки на invoker? Но здесь ни один объект не вызывает этот конструктор –

+0

ключевое слово this относится к текущему экземпляру объекта - поэтому он ссылается на переменную экземпляра, которая является «Q q;» – planetjones

+0

Затем , вызывающий новый Производитель (q); будет точно таким же, как Производитель re = new Производитель (q); Если это так, то второй способ полезен? –

0
  • this.q является переменным экземпляром q объявлен в строке 2
  • равнины q является параметром конструктора объявлен в строке 4
  • В строке 6, объект является экземпляром с помощью new, то метод start является немедленно вызвал его. Там просто нет никакой явной ссылки на сохраненный объект. Однако, поскольку он использовался для запуска потока, он будет неявным образом упоминаться в этом потоке и, таким образом, не будет иметь права на сбор мусора до тех пор, пока поток не завершится.
+0

спасибо, было очень полезно –

+0

Тогда звонок новый Производитель (q); будет точно таким же, как Производитель re = new Производитель (q); Если это так, то второй способ полезен? –

+0

@Abhay: второй способ хранит ссылку 're' на объект, поэтому вы можете вызывать методы на нем или передавать его как параметр somwhere. Большинство объектов бесполезны без ссылки на них. –

0

В строке 5 класс private (this.) Q создается экземпляром q, переданным в конструкторе.

В строке 6 создается новая тема, но объект никогда не используется снова, поэтому это всего лишь короткий способ сделать это.

Thread t = new Thread(this,"Producer"); 
    t.start(); 

эквивалентно

new Thread(this,"Producer").start(); 
+0

Затем , вызывающий новый Производитель (q); будет точно таким же, как Производитель re = new Производитель (q); Если это так, то второй способ полезен? –

+0

новый продюсер (q) просто делает продюсера. Вы не можете использовать объект в любой последующей части вашего кода в этом случае. Это нормально, если вам это не нужно. Если вам понадобится объект (в вашем случае «re») позже, вы будете использовать этот второй способ! –

0
  1. В заявлении this.q = q;, this.q относится к q области экземпляра класса, в то время как q относится к параметру.
  2. new Thread(this, "Producer") создает новый экземпляр класса Thread, поэтому да, экземпляр объекта создается до вызова метода start().
0

В строке 5, this.q относится к области q от Producer объекта, который в данный момент построен. Второй q относится к аргументу конструктора, то есть к Q, который был передан в конструктор.

На линии 6 находится новый Thread объект построен. Он просто не привязан к какой-либо переменной. Вместо этого непосредственно вызывается метод start(). Это общий шаблон, если не требуется ссылка на объект Thread.

Вы мог заменить его с этим эквивалентным кодом:

Thread thread = new Thread(this, "Producer"); 
thread.start(); 

Это будет иметь тот же эффект.

+0

ОК спасибо, только что подтвердил –

+0

Затем , вызывающий новый Производитель (q); будет точно таким же, как Производитель re = new Производитель (q); Если это так, то второй способ полезен? –

+0

@Abhay: второй способ является более распространенным, потому что * обычно * объект фактически не делает ничего, кроме тех случаев, когда вы вызываете на нем методы. Это означает, что обычно вы хотите сохранить ссылку на него в переменной. «Thread» здесь немного отличается: если вы вызвали 'start()', он будет запускаться сам по себе. Вы * только * должны удержать его, если вам нужно будет проверить его состояние или что-то подобное. –