Пул потоков с использованием Executor Framework

Я использую структуру исполнителя для создания нескольких экземпляров объекта Fadder и печати результата. Я пытаюсь научиться использовать несколько потоков, чтобы выполнить задачу быстрее. Проблема, с которой я сталкиваюсь, заключается в том, что числа печатаются в случайном порядке каждый раз, когда я запускаю программу. Я думал, что создание нового объекта для каждой итерации цикла решит эту проблему, но он по-прежнему печатает число в «случайном» порядке. Могу ли я каким-либо образом гарантировать, что потоки печатаются в том порядке, в котором они должны запускаться? как 1,2,3,4,5. Спасибо

package fadder;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Fadder {
    private final int n;
    Fadder(int n){
        //initialize Fadder
        this.n = n;
    }
    Fadder add(int m){
        //create new Fadder
        return new Fadder(n+m);
    }
public static void main(String[] args) {
     int threadnum = Runtime.getRuntime().availableProcessors();
        ExecutorService executor = Executors.newFixedThreadPool(threadnum);
        Fadder MyAdder = new Fadder(1);
        for (int i = 0; i < 5; i+=1 ) {
            int index = i;
            //lambda function to print Fadder
        executor.submit(() -> {
                    System.out.println(String.valueOf(MyAdder.add(index)));
                });
    }
    executor.shutdown();
}
}

person Art    schedule 07.04.2017    source источник
comment
Да: измените свою первую строку на int threadnum = 1; — честно, пожалуйста, почитайте темы — все дело в том, что они могут делать что-то параллельно, каждая со своей скоростью. Если вы хотите печатать число в последовательном порядке, вам не следует использовать потоки. Использование потоков для этого не делает его быстрее. Если вычисление числа занимает много времени, то потоки могут иметь смысл, можно делать вычисления в отдельных потоках, собирать все результаты в коллекцию и потом их сортировать.   -  person Erwin Bolwidt    schedule 07.04.2017
comment
У Fadder нет метода toString, откуда вы знаете, в каком порядке они выполняются?   -  person user253751    schedule 07.04.2017
comment
Спасибо, Эрвин, я знал о threadnum = 1, но это был просто тест, чтобы увидеть, смогу ли я заставить его работать так, как я хотел, для более крупной программы.   -  person Art    schedule 07.04.2017
comment
@immibis У меня был метод toString, но он стал избыточным из-за функции String.valueOf.   -  person Art    schedule 07.04.2017
comment
@Art String.valueOf вызывает функцию toString объекта   -  person user253751    schedule 07.04.2017


Ответы (1)


Вы не можете гарантировать последовательность, в которой многие потоки будут обрабатывать ваш код. Но, будет параллельный поток, можно. Смотри ниже :

Stream<Integer> stream = Stream.iterate(1, i->i+1).limit(5) ;
      stream.parallel().forEachOrdered(System.out::println);
person DJAM Silvère Gatien    schedule 07.04.2017