Как управлять непрерывными запущенными потоками - PullRequest
0 голосов
/ 29 апреля 2019

Я работаю над программным обеспечением, которое должно поддерживать непрерывную работу n потоков, поэтому я решил реализовать простейшее решение, о котором я мог подумать: каждый из моих потоков определен в классе, который реализует Runnable, и в основномЯ запускаю все из них.
Недавно я заметил, что один из моих потоков не запускается, поэтому я думаю, что мой код вообще не безопасен.

Это пример одного из моих исполняемых файлов:

public class ExRunnable implements Runnable {

    @Override
    public void run() {
        printLog("ExRunnable started...");
        try {
            while (true) {
                ...
            }
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

И вот как это начинается в основном:

public static void main(String[] args) {
        if (readConfigurationData()) {

            Thread exThread = new Thread(new ExRunnable());
            exThread.start();

            ...
        }
        else
            printLog("Invalid configuration data!");
    }

Я начинаю около 12темы в моей основной функции, и только один из них, кажется, не запускается.Я хотел бы знать, действительно ли мой метод небезопасен, и не могли бы вы предоставить мне более безопасный шаблон.

Большое спасибо!

1 Ответ

0 голосов
/ 29 апреля 2019

То, что вы пытаетесь реализовать, это пул потоков.Почему бы не использовать некоторые из уже существующих реализаций пула потоков, которые поставляются с Java?

Например, вот пример кода с пулом из 5 потоков и планированием потока каждую 1 секунду:

ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
ScheduledFuture<?> future = executor.scheduleAtFixedRate(() -> {
System.out.println("Thread running");
}, 0, 1000, TimeUnit.MILLISECONDS);

Дополнительная информация в JavaDoc

...