Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Последовательный запуск Thread процессов


Автор: _Y_ 28.7.2014, 11:23
Добрый день. Появилась у меня задача последовательно запускать Thread процессы. При этом основная программа не должна ждать выполнения чего-либо: отдала команду запустить, скажем 2 процесса и продолжает работу, а процессы уже сами должны выполняться один за другим.

Поскольку на Java в последние годы пишу спорадически, пришлось поискать в сети решение поэлегантнее. Одно из http://stackoverflow.com/questions/289434/how-to-make-a-java-thread-wait-for-another-threads-output мне понравилось и написал я такой код:

Код

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThreads {

    public static void main(String[] args) {
        
        ExecutorService pool = Executors.newFixedThreadPool(2);

        try {
         
         System.out.println("-0-");
         pool.submit(new TestCallable("C1")).get();
            System.out.println("-1-");
         pool.submit(new TestCallable("C2")).get();
            System.out.println("-2-");            
            
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        
        System.exit(0);
    }

}


В качестве процессов вызываются объекты такого класса:

Код

import java.util.concurrent.Callable;

public class TestCallable implements Callable<Boolean> {
    
    private String str;
    
    public TestCallable(String str){
        this.str = str;
    }
    
    @Override
    public Boolean call() throws Exception {
        System.out.println(str + " START");
        Thread.sleep(2000);
        System.out.println(str + " STOP");
        return true;
    }
}


В результате все работает последовательно, но основной процесс main ждет окончания выполнения Thread-ов. Т.е. никакой параллелизации не получается и результат работы программы
Код

-0-
C1 START
C1 STOP
-1-
C2 START
C2 STOP
-2-
  • Вопрос 1: Что я не так делаю, что не параллелизирует выполнение?
  • Вопрос 2: Результат не зависит от того какое число я ставлю аргументом:  Executors.newFixedThreadPool(1) или Executors.newFixedThreadPool(2). Мне казалось, что этот аргумент должен влиять именно на ход основной программы. В чем я запутался?

Спасибо!


Автор: _Y_ 28.7.2014, 15:25
Разобрался (на другом форуме подсказали). Копипастил нерабочий код. Вызов методов .get() в нем лишний. Надо так:
Код

pool.submit(new TestCallable("C2"));

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)