2013-11-10 5 views
0

У меня есть класс MainClass, рабочий класс и класс Supervisor. В MainClass я создаю 10 классов Worker и класс Supervisor, которые запускаются в отдельных потоках.Планирование потоков Java

class MainClass { 

    public static void main(String args[]) { 

    for (int i=0; i<10 ;i++) { 
     Thread t = new Thread(new Worker()); 
     t.start(); 
    } 

    (new Thread(new Supervisor()).start(); 

} 

.

class Worker extends Thread { 
    public void run() { 
    while(true) { 
     if(some_condition) { 
     //do stuff 
     } else { 
     // pause thread execution for undefined time. 
     } 
    } 
    } 
} 

.

class Supervisor extends Thread { 
    public void run() { 
    while(true) { 
     if(some_condition) { 
     // restart Workers thread that are paused. 
     } 
     // do other stuff 
    } 
    } 
} 

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

+1

В чем вопрос? – BackSlash

+0

Вы посмотрели @ классы, доступные в 'java.util.concurrent'? –

+0

[эти примеры] (http://arashmd.blogspot.com/2013/07/java-thread-example.html) может помочь –

ответ

0

Я не знаю, как реализовать это, потому что условия в каждом потоке независимы друг от друга, поэтому мне не нужно синхронизировать, поэтому я не могу использовать wait-notify.

Уверенный, вы можете.

Тонкость здесь состоит в том, что предположительно Supervisor фактически не знает, действительно ли рабочие потоки приостановлены. (Если это произойдет, то условия не независимы.)

Поскольку руководитель не знает, являются ли на самом деле замолчала нити (по предположению), вы должны разработать то, что вы хотите, чтобы произошло, если он пытается возобновите уже без изменений.

a) Должен ли бесполезный ничего не делать?

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

Если ответ (b), то вам нужно беспокоиться о безопасности потоков. Если ответ (a), то вы не (, если у вас нет каких-либо других данных для передачи между потоками!)

В любом случае вы все равно можете использовать wait и notify.

+0

Если поток не приостановлен, чем ничего не делать. Проблема в том, что я не понимаю, как использовать wait notify здесь (я новичок). Работник ожидает, если произойдет условие, но Супервизор перезапустит приостановленных работников, если произойдет внутреннее условие, которое не имеет никакого отношения к условию, в котором остановился рабочий. Итак, на какой блокировке я синхронизирую wait() и notify()? – user2361682

+0

Это очень странная ситуация, но ОК, предполагая, что это правда, это не имеет значения. Просто синхронизируйтесь на одном глобальном объекте. И вызовите wait и сообщите об этом объекте. –

0

Согласно моему пониманию, вы хотите создать отдельные пулы потоков, которые состоят из 10 работников или номера согласно вашему требованию.

Что касается бассейнов, вы можете проверить ThreadPoolExecutor в java.util.concurrent api. Внутренне ThreadPoolexecutor также создает рабочих потоков для выполнения задач.

Попробуйте прочитать ThreadPoolExecutor, это может помочь вам или, пожалуйста, уточнить свой вопрос, какова ваша конечная цель, которую вы хотите достичь этой проблемой.

Смежные вопросы