powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Thread pool
6 сообщений из 6, страница 1 из 1
Thread pool
    #39332298
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Натолкнулся на статью, рассказывающую о собственной реализации пула потоков, и попытался реализовать. Однако, столкнулся с проблемой, что после выполнения всех операций программа висит, ожидая продолжения. Можно ли как-то корректно завершить ее?
Класс пула потоков:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
public class WorkQueue {
    private final int nThreads;
    private final PoolWorker[] threads;
    private final LinkedList queue;


    public WorkQueue(int nThreads)
    {
        this.nThreads = nThreads;
        queue = new LinkedList();
        threads = new PoolWorker[nThreads];
  }


    public void start() {
        for (int i=0; i<nThreads; i++) {
            threads[i] = new PoolWorker();
            threads[i].start();
        }
    }

    public void execute(Runnable r) {
        synchronized(queue) {
            queue.addLast(r);
            queue.notify();
        }

    }

    private class PoolWorker extends Thread {
        public void run() {
            Runnable r;

            while (true) {

                synchronized(queue) {
                    System.out.println(queue.size());
                    while (queue.isEmpty()) {
                        try
                        {
                            queue.wait();
                        }
                        catch (InterruptedException ignored)
                        {

                        }
                    }

                    r = (Runnable) queue.removeFirst();
                }


                try {
                    r.run();
                }
                catch (RuntimeException e) {
                    throw new RuntimeException("Exception for method run()", e);
                }
            }
        }
    }
}



Main
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class Main {


        public static void main(String[] args) throws InterruptedException {
            WorkQueue pool = new WorkQueue(2);
            pool.start();

            for (int i = 1; i < 10; i++) {
                final int finalI = i;
                pool.execute(new Factorial(finalI));
               
            }


            Thread.sleep(5_000);
            System.out.println("Done");

        }

}



Класс факториала:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class Factorial implements Runnable {
    private final int fact;

    public Factorial(int fact) {
        this.fact = fact;
    }

    @Override
    public void run() {
        int result = 1;
        for (int j = 1; j < fact + 1; j++) {
            result += result * j;
            try {
                Thread.sleep(500);
            } catch (InterruptedException ignore) {
            }
        }
        System.out.println(Thread.currentThread()+" Result " + fact + " = " + result);
    }
}
...
Рейтинг: 0 / 0
Thread pool
    #39332383
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timein,

У вас потоки в пуле недемонические, потому и висит даже после остановки потока "main", потому как JVM не завершается пока есть хотя бы один поток не демон.
...
Рейтинг: 0 / 0
Thread pool
    #39332387
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
System.exit(0);
...
Рейтинг: 0 / 0
Thread pool
    #39332388
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonSystem.exit(0);

или

UserRuntime.getSystemEnvironment().getCurrentMashine().getPowerButton().executePowerOff();
...
Рейтинг: 0 / 0
Thread pool
    #39332392
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, мне надо, чтобы программа закрывалась, когда последний поток отработал. А у меня получается, что она, программа, посчитала 9-ый факториал и висит. А если я напишу System.exit(0), то у меня она закроется, так и не дав всем потокам отработать.
...
Рейтинг: 0 / 0
Thread pool
    #39332394
Фотография ponuch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeinНет, мне надо, чтобы программа закрывалась, когда последний поток отработал. А у меня получается, что она, программа, посчитала 9-ый факториал и висит. А если я напишу System.exit(0), то у меня она закроется, так и не дав всем потокам отработать.

вам тут глупости советуют в духе rm -rf /. Надо потоку сказать Thread.setDaemon(true)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Thread pool
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]