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

Код: 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
23.10.2016, 21:05
    #39332383
vimba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread pool
Timein,

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

или

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

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


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