Передача потока в конструктор другого потока
Что позволяет сделать Runnable target в конструкторе public Thread(Runnable target, String name)?
Допустим, у нас есть:
public static class TestedThread extends Thread {
public void run() {
}
}
public static void main(String[] args) {
TestedThread commonThread = new TestedThread();
Thread threadA = new Thread(commonThread, "Нить 1");
Thread threadB = new Thread(commonThread, "Нить 2");
threadA.start();
threadB.start();
}
Какой смысл передавать поток в конструктор другого потока?
Ответы (1 шт):
Конструктор Thread принимает объект типа Runnable. Передать туда объект Thread можно лишь потому, что Thread implements Runnable
Документация описывает что происходит с переданным объектом (target):
target - the object whose run method is invoked when this thread is started. If null, this thread's run method is invoked.
То есть если передан не null, то при запуске потока будет вызван метод run переданного объекта
Изменённый пример из вопроса:
private static class ThreadA extends Thread
{
public ThreadA(String name)
{
super(name);
}
@Override
public void run()
{
System.out.println("ThreadA.run runs in thread " + Thread.currentThread().getName());
}
}
private static class ThreadB extends Thread
{
public ThreadB(Runnable target, String name)
{
super(target, name);
}
}
public static void main(String[] args)
{
Thread threadA = new ThreadA("Thread1");
Thread threadB = new ThreadB(threadA, "Thread2");
threadB.start();
}
Вывод:
ThreadA.run runs in thread Thread2
Если переопределить метод run в ThreadB и не вызывать в нём target:
@Override
public void run()
{
System.out.println("ThreadB.run runs in thread " + Thread.currentThread().getName());
}
то смысла в передаче target не будет:
ThreadB.run runs in thread Thread2