Многоразовый вызов метода потоком

210
24 ноября 2017, 06:56

В процессе изучения многопоточности JAVA возник вопрос:

Если мне с основного класса нужно вызывать во втором потоке какой-то метод с другого класса (например я буду проверять коллекцию на наличие некоторого элемента), но мне это нужно делать не в определенный промежуток времени, а по какому-то событию, (в нашем случае это каждые 10000 миллисекунд), так вот, как мне опять запустить мой метод с класса ThreadTest, если прошлый поток уже отработал и использовать th.start() нельзя?

Нужно ли для этого привязывать каждый раз к нему новый поток, так как прошлый отработал свое?

if(!th.isAlive()){} если прошлый поток уже не жив, мы создаем новый th = new Thread(ts) и запускаем его th.start() это единственный вариант?

Есть основной класс

public class Main extends Thread {
    Thread th;
    ThreadTest ts = new ThreadTest();
    public void run() {
        while(true) {
            try {
                Thread.sleep(10000);
                if(!th.isAlive()) {
                    th = new Thread(ts);
                    th.start();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public Main() throws InterruptedException   {
         th = new Thread(ts);
         th.start();
         this.start();
    }
    public static void main(String[] args) throws InterruptedException{
        new Main();
    }
}  

И второстепенный

public class ThreadTest implements Runnable {
    @Override
    public void run() {
        for(int i=0; i<999999; i++){
            System.out.println("Do stuff!");
        }
    }
}
  1. Если это единственный способ, как сильно это отразиться на производительности?

  2. Если каждый раз будет создаваться поток с именем Thread-n наступит ли момент когда нельзя будет создать новый поток? (переполнение int (в теории)).

  3. Будет ли уборщик мусора корректно убирать отработавшиеся потоки или они будут занимать память?

Извините если что не так, особо глубоко не понимаю, спасибо заранее.

READ ALSO
Неравенство Коши на языке java

Неравенство Коши на языке java

Есть неравенство КошиПользователь задает значение n

270
Создание GUI на Java в IntelliJIDEa

Создание GUI на Java в IntelliJIDEa

Создаю новый проект, в нем класс и форму, добавляю в JPanel кнопку, но почему-то не могу ни поменять её размер, ни перетащить в другое место на панели,...

281
Можно ли вызвать НЕ synchronized метод &ldquo;заблокированного&rdquo; объекта?

Можно ли вызвать НЕ synchronized метод “заблокированного” объекта?

Есть 2 потока, один из них начал выполнение synchronized метода, внутри которого применяется Threadsleep(5000)

183