2016-04-01 2 views
-1

Я недавно начал работать над Java Project, который был сделан много лет назад, и я стараюсь понять код как можно больше (учитывая, что я как бы начинающий стараюсь развиваться).Java-Thread вызывает doMain(), когда нет run()?

Вот мои сомнения: У меня есть два класса, допустим, это ClassA и ClassB, которые не расширяют друг друга. В ClassA есть основной метод, который запускает следующий код:

Thread object = new Thread(ClassB); 
object.start(); 

Из моего понимания потоков, то это должно вызвать метод Run() на ClassB. Однако самый важный метод в ClassB - метод doMain(), и нет run().

Как узнать, действительно ли метод doMain() является вызываемым методом?

Спасибо за помощь :)

P.S. Это пример кода, реальный код в 1000 раз сложнее и, возможно, есть нюансы, которые я не получаю, но любые подсказки о том, что делать, были бы замечательными.

+0

Добавить код отладки. –

+2

Если в ClassB нет «run()», класс из класса ClassB не реализует Runnable, поэтому конструктор, вызывающий новый поток (ClassB), не должен компилироваться. см. https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#Thread(java.lang.Runnable) –

+1

Я сомневаюсь, что вы можете скомпилировать «новую тему (ClassB);». Вам нужно сделать экземпляр класса B, например. новый ClassB(). Если ваш ClassB не реализует Runnable, тогда код не будет компилироваться. Наконец, ClassB не может реализовать Runnable без метода run(). Таким образом, либо ваш код не компилируется, либо у вас есть метод run, возможно, в родительском классе, как предлагали другие? – Michal

ответ

3

Существует два конструктора тему вы должны использовать здесь

Thread object = new Thread(classB); 

Либо ClassB является String или Runnable. Других вариантов компиляции нет. Предполагая, что это не является String, и это Runnable он должен иметь метод run() или он не будет компилировать (или если его абстрактный класс, который не может создать экземпляр)

Короче говоря, у вас есть run() метод.

Это пример кода, реальный код в 1000 раз сложнее и, возможно, есть нюансы, которые я не получаю, но любые подсказки о том, что делать, были бы замечательными.

Самый простой способ доказать это, чтобы проверить иерархию вызовов doMain() в вашей IDE или добавить точку останова на этой линии и запустить свой код в отладчике.

+0

спасибо, проверяя иерархию вызовов, я вижу, что run() вызывается в родительском классе. –

1

Метод Thread.start всегда вызывает метод , он указан явно в документации: Thread#start().

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

+1

Возможно, это так. ClassB не является абстрактным, но он расширяет определенный класс, содержащий метод run(). А классC вызывает doMain(). –

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