TestedThread commonThread = new TestedThread(handler);
создается основной поток, если его зациклить он будет вечно выполняться.
Thread threadA = new Thread(commonThread, "Нить 1");
Thread threadB = new Thread(commonThread, "Нить 2");
Нити создаются странно, thread над thread в этом есть какой то смысл?
ну и пример по сути бесполезный, да ведь?
Основной поток должен всегда работать и куда то писать что то, так?
Дочерние потоки должны быть свои и делать то, что им нужно, так ведь?
Denis Chaban
26 уровень
Помогите разобраться
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Max
1 марта 2020, 09:28
Полный и детальный разбор этой задачи я сделал тут https://javarush.com/help/11837
Найти легко - самый длинный комментарий)
Не забывайте оценивать, чтобы я знал сколько человек прочитало и видел вашу реакцию. Это, в свою очередь, будет стимулировать меня на детальный разбор других сложный задач курса.
+2
Стас ПасинковSoftware Developer в ZipyMaster
17 августа 2018, 12:50решение
вот тут во втором случае создается поток на основе первого.
конструктор класса Thread принимает любой Runnable. вот вообще любой объект, который имплементит этот интерфейс можно сюда передать. в том числе и объект класса Thread, который сам по себе имплементит этот интерфейс.
потом тред возьмет этот объект Runnable и начнет выполнять его метод run() когда ты запустишь поток. и будет работать с ним именно через ссылку типа Runnable. а значит все, что он будет видеть в этом объекте - это только метод run(). все остальные методы (в том числе и конструкторы) ему будут не видны :)
поэтому, в твоем случае поток threadA будет выполнять тот же код, что и указан в TestedThread в методе run()
+5
Стас ПасинковSoftware Developer в ZipyMaster
17 августа 2018, 12:57
все остальное в этом объекте - игнорится) в том числе и конструктор не вызывается и то что происходит в конструкторе TestedThread - не выполняется для threadA и threadB ;)
+1
Denis Chaban
21 августа 2018, 12:06
спасибо
0
Denis Chaban
17 августа 2018, 11:27
здесь вообще в main вызываю
commonThread.setUncaughtExceptionHandler(handler);
commonThread.setDefaultUncaughtExceptionHandler(handler);
странная штука
public class Main {
public static Thread.UncaughtExceptionHandler handler = new OurUncaughtExceptionHandler();
public static void main(String[] args) {
TestedThread commonThread = new TestedThread();
commonThread.setUncaughtExceptionHandler(handler);
commonThread.setDefaultUncaughtExceptionHandler(handler);
T1 t1 = new T1();
T2 t2 = new T2();
t1.start();
t2.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
t1.interrupt();
t2.interrupt();
}
public static class TestedThread extends Thread {
}
public static class OurUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t.getName() + ": " + e.getMessage());
}
}
public static class T1 extends Thread {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " T1!!!");
} catch (InterruptedException e) {
throw new RuntimeException("III T1 error");
}
}
}
}
public static class T2 extends Thread {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " T2!!!");
} catch (InterruptedException e) {
throw new RuntimeException("III T1 error");
}
}
}
}
}
0
Стас ПасинковSoftware Developer в ZipyMaster
17 августа 2018, 12:51
повыделяй код пожалуйста. а то просто текстом он не читаем
0
Denis Chaban
17 августа 2018, 11:08
Ниже два класса T1 и T2, работают в цикле пока не сработает прерывание, у основного потока запускать run бессмысленно, он не нужен. Достаточно получается создать объект TestedThread.
public class Main {
public static Thread.UncaughtExceptionHandler handler = new OurUncaughtExceptionHandler();
public static void main(String[] args) {
TestedThread commonThread = new TestedThread(handler);
T1 t1 = new T1();
T2 t2 = new T2();
t1.start();
t2.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
t1.interrupt();
t2.interrupt();
}
public static class TestedThread extends Thread {
public TestedThread(Thread.UncaughtExceptionHandler handler) {
setUncaughtExceptionHandler(handler);
setDefaultUncaughtExceptionHandler(handler);
}
}
public static class OurUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t.getName() + ": " + e.getMessage());
}
}
public static class T1 extends Thread {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " T1!!!");
} catch (InterruptedException e) {
throw new RuntimeException("III T1 error");
}
}
}
}
public static class T2 extends Thread {
.... как т1 ...
}
}
0