object.join();
Этот код будет ожидать в главном потоке окончания потока MyClass.
Тогда в MyClass у вас есть цикл
for (int i = 0; i < numberThreads; i++) {
secObj[i] = new SecondClass();
secObj[i].start();
}
Этот цикл запускает новые потоки второго класса, количество потоков = число нитей .
Тогда:
//wait
Thread.sleep(time);
Если время для сна слишком мало - тогда MyClass может отправлять прерывания даже до того, как могут начаться некоторые потоки SecondClass.
Но тогда вы прерываете другое количество потоков " par ", я не вижу, где вы это объявляете:
for (int i = 0; i < par; i++) {
secObj[i].interrupt();
}
Итак, вы прерываете разное количество потоков. Если вы обрабатываете исключение в SecondClass, то оно может работать после завершения MyClass.
Мой пример:
public class MyClass extends Thread {
private int numberThreads;
private int time;
static class SecondClass extends Thread{
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("interrupted");
}
System.out.println("finished");
}
}
MyClass(int numberThreads, int time){
this.numberThreads = numberThreads;
this.time = time;
}
public static void main(String[] args) {
MyClass object = new MyClass(6, 1000);
object.start();
//wait in main thread
try {
object.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main thread is finished");
}
public void run() {
SecondClass[] secObj= new SecondClass[numberThreads];
//start all
for (int i = 0; i < numberThreads; i++) {
secObj[i] = new SecondClass();
secObj[i].start();
}
try {
//wait
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Interrupt all
for (int i = 0; i < numberThreads; i++) {
secObj[i].interrupt();
}
System.out.println("MyClass is finished");
}
}
Выходы:
interrupted
interrupted
finished
finished
interrupted
finished
interrupted
finished
interrupted
finished
MyClass is finished
interrupted
finished
Main thread is finished