2016-05-03 6 views
0

Мне нужно разделить массив с учетом количества потоков. Например, у меня есть массив [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] и пользовательский подсчет количества потоков, который будет работать с элементами в этом массиве. Моя задача - распределить работу между элементами массивов и потоками.Разделение многопоточного массива Java

Количество нитей = 2 ->thread1: [1] [2] [3] [4] [5] thread2: [6] [7] [8] [9] [10]. Но что мне нужно делать, если потоки будут, например, 7. Хо, чтобы отделить работу в этом случае?

+1

'[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]' является * 10-мерным массивом *, а не одним массив из 10 элементов. '{1,2,3,4,5,6,7,8,9,10}' - это единый массив с 10 элементами. – Andreas

+0

Как насчет использования ExecutorService с файлом Threadpool, который имеет необходимое количество потоков? Как и ExecutorService пул = Executors.newFixedThreadPool (poolSize). Затем вы можете отправлять задания, итерации по массиву и представления каждого элемента в качестве параметра выполняемой задачи. Взгляните на https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html – mdewit

ответ

2

здесь пример приложения, которое разбивает входной массив на тему:

final int threadCount = 7; 
final int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

int from = 0; 
for (int i = 0; i < threadCount; i++) { 
    final int to = (from + (int) Math.ceil((a.length - from)/(double) (threadCount - i))); 
    System.out.println("Thread #" + i + " will use " + Arrays.toString(Arrays.copyOfRange(a, from, to))); 

    from = to; 
} 

фактически (благодаря @Andreas), вместо потолка, вы можете просто использовать целочисленную арифметику:

final int to = from + ((a.length - from)/(threadCount - i)); 

выход:

Thread #0 will use [1, 2] 
Thread #1 will use [3, 4] 
Thread #2 will use [5, 6] 
Thread #3 will use [7] 
Thread #4 will use [8] 
Thread #5 will use [9] 
Thread #6 will use [10] 
+0

Мне нравится 'Math.round()' лучше. ;-) – Andreas

+0

@Andreas math.round не будет работать, например 11 элементов и 10 потоков –

+0

Работает. Попробуй. Вы даже можете сделать 'Math.floor()'. Почему первые потоки получат удовольствие? – Andreas

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