Можно ли передавать ресурсы на поток при использовании параллельных потоков JAVA? - PullRequest
0 голосов
/ 24 января 2019

У меня очень простой вопрос, но я не нашел темы, которая бы четко отвечала на него ... (возможно, я пропустил это ...: o). Я хотел бы знать, при использовании параллельных потоков, возможно ли дать каждому потоку пользовательские данные (разные для каждого потока).

Например, мы можем представить, что я хочу знать, какой поток обрабатывал какую-либо сущность.

Пример: у меня есть следующая коллекция [0,1,2,3,4,5] Я создаю параллельные потоки и использую метод карты, чтобы квадрат был связан с каждым элементом. У меня должен быть следующий вывод: [0,1,4,9,16,25] Но я хотел бы определить, какой поток обрабатывал какие объекты, например, если у меня есть 2 потока:

резьба 1 -> [0,1,2]

резьба 2 -> [3,4,5]

Надеюсь, я в порядке, спасибо заранее тем, кто найдет время, чтобы ответить на мой вопрос!

1 Ответ

0 голосов
/ 24 января 2019

С помощью Thread.currentThread() вы можете получить поток из текущего активного контекста.

Посмотрите этот небольшой фрагмент:

final int[] ints = IntStream.range(0, 6)
    .parallel()
    .map(i -> {
        System.out.println("thread " + Thread.currentThread().getName() + " maps " + i + " to " + i * i);
        return i * i;
    })
    .toArray();

System.out.println("Final array " + Arrays.toString(ints));

Печатает что-то вроде этого:

thread main maps 5 to 25
thread ForkJoinPool.commonPool-worker-1 maps 2 to 4
thread ForkJoinPool.commonPool-worker-2 maps 3 to 9
thread ForkJoinPool.commonPool-worker-3 maps 0 to 0
thread main maps 1 to 1
thread ForkJoinPool.commonPool-worker-4 maps 4 to 16
Final array [0, 1, 4, 9, 16, 25]

Хотя это не является детерминированным, например, каждая итерация, вероятно, приведет к другому результату печати

...