Запускать и прерывать потоки через некоторое время - PullRequest
0 голосов
/ 28 апреля 2018

Я хочу запустить некоторое количество потоков одновременно и через некоторое время остановить их все. Это правильно? :

 object = new MyClass(numberThreads, time);
 object.start();

//wait in main thread
    try {
        object.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

Теперь в классе MyClass у меня есть:

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) {
        System.out.println("end");
    }
        //Interrupt all
        for (int i = 0; i < par; i++) {
            secObj[i].interrupt();
        }
}

Иногда после того, как все потоки были прерваны, кажется, что некоторые из них не были запущены, но если все они запускаются в одно и то же время, что должен был выполнить каждый, что я делаю неправильно?

1 Ответ

0 голосов
/ 28 апреля 2018
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
...