, но я не понимаю, почему две нити созданы?
Два потока запускаются, потому что вы начинаете их в A()
конструктору:
public A() {
this.start();
}
и вы строительство двух объектов - в A
и B
, который проходит A
:
A a = new A();
B b = new B();
По умолчанию, когда вы говорите new B()
, поскольку он не имеет конструктора no-arg, он вызывается конструктором no-arg supe rclass. Поэтому он вызовет конструктор A
, который запускает поток. См. Java documentation here. Цитирование:
Вам не нужно предоставлять конструкторы для вашего класса, но при этом вы должны быть осторожны. Компилятор автоматически предоставляет конструктор по умолчанию без аргументов для любого класса без конструкторов. Этот конструктор по умолчанию вызовет конструктор без аргументов суперкласса. В этой ситуации компилятор будет жаловаться, если суперкласс не имеет конструктора без аргументов, поэтому вы должны убедиться, что он это делает. Если у вашего класса нет явного суперкласса, то он имеет неявный суперкласс Object, у которого нет конструктора без аргументов.
В стороне, это не хорошая практика, чтобы начать поток внутри его конструктора. Есть некоторые условия гонки нитей, которые могут произойти, когда вы это делаете. Гораздо лучше позвонить по телефону a.start()
после того, как вы позвоните по телефону new A()
. Кроме того, это лучший шаблон для определения класса, который реализует Runnable
вместо расширения Thread
.Так что ваш код должен быть:
class A implements Runnable() {
public A() {
// don't start it here
}
public void run() {
...
}
}
...
Thread a = new Thread(new A());
a.start();
Thread b = new Thread(new B());
b.start();