2013-09-30 2 views
-1
class A extends Thread { 
    ThreadDemo demo; 
    public A(ThreadDemo td) { 
     demo = td; 
    } 
    public void run() { 
     demo.doSomething(); 
    } 
} 
public class ThreadDemo { 
    int count = 1; 
    public synchronized void doSomething() { 
     for (int i = 0; i < 10; i++) 
      System.out.println(count++); 
    } 
    public static void main(String[] args) { 
     ThreadDemo demo = new ThreadDemo(); 
     A a1 = new A(demo); 
     A a2 = new A(demo); 
     a1.start(); 
     a2.start(); 
    } 
} 

1.Возможно знать нуждающегося этого конструктора в этом коде. и объясните, как работает эталонная ссылка в классе Aнепонятно с этой концепцией ниток

p.s: Я новичок в этой концепции, поэтому PLZ помогаю мне с ценными! thnx заранее!

+6

Вопрос, который вы задаете, касается не потоков, а всего лишь объектов и того, как они работают. –

+3

У вас должно быть минимальное понимание проблемы. Я предлагаю вам кое-что прочитать о Java в целом. Может быть: http://docs.oracle.com/javase/tutorial/getStarted/index.html – Gray

+0

@ColinMorelli отредактировал – Dineshdk

ответ

2

1.why demo obj передается в класс A?

Поскольку у вас есть конструктор класса А, определенный так.

public A(ThreadDemo td) 
{ 
    demo = td; 
} 

2.Если я заменить a1 = новый A (демо); с Thread a1 = новая тема (demo); он будет создавать конструктор Thread.Thread (ThreadGroup, Runnable, String, long) не применимо (фактические и формальные списки аргументов различаются по длине), почему эта ошибка появляется?

Поскольку класс Thread не принимает объект класса ThreadDemo в качестве параметра. Однако использование полиморфизма вы можете сделать что-то вроде

Thread a1 = new A(demo); 

3.Why они проходят демонстрации в качестве эталона в классе А

Я думаю, что вы хотели спросить why they are passing the same reference in both the threads или ответ такой же, как 1-й вопрос. Они передают одну и ту же ссылку, так что только один поток может работать с вашим методом doSomething() класса ThreadDemo (возможно, целью было продемонстрировать синхронизацию).

+0

благодаря тому, что bro yur ans no.2 был полезен, и еще одно сомнение в том, как конструктор работает при создании класса Aj. и объясните, что этот конструктор нуждается в этом коде – Dineshdk

+0

Когда создается какой-либо экземпляр класса, вызывается соответствующий конструктор. Если конструктор суперкласса явно не вызывается из конструктора (1-я строка), используя super(), тогда java-компилятор помещает вызов конструктору по умолчанию в качестве первой строки данного конструктора. В вашем случае вы создаете новый объект класса A как новый A (demoObjectYouCreated), поэтому он будет вызывать соответствующий конструктор public A (ThreadDemo td) вашего класса. Обратите внимание, что если вы укажете параметризованный конструктор (не по умолчанию), тогда компилятор не будет создавать для вас значение по умолчанию. –

+0

Из-за того, почему такой конструктор необходим в классе A, вы должны прочитать synchronization.Google! Просто, чтобы ответить на него в общих чертах, у вас есть общий объект, по которому вы синхронизируете методы (в основном вы можете думать об этом как о блокировке). Только один поток может выполнять эти синхронизированные методы (только больше потоков может получать монитор объектов за раз). –

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