2012-02-24 3 views
4

Прежде чем идти дальше, это отдельно от моей домашней работы. У меня есть проблема с тем, что у меня возникают проблемы, но это не главная задача задания.Добавление элементов массива с помощью многопоточности

Для назначения мы просто сохраняем числа в массиве и добавляем элементы массива через многопоточность.

Пользователь вводит количество потоков, которые они хотели бы запустить, и какова должна быть верхняя граница.

Например: Верхняя граница: 12 Тем: 2 Приложение должно сложить элементы 1-6, затем 7-12. В этом случае нижняя граница начинается с 1, а верхняя граница начинается с 6. Затем второй раз, когда петля должна итерации, верхняя граница должна быть 7, а верхняя граница должна быть равна 12.

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

Это довольно просто, если количество нитей равномерно разделено на начальную верхнюю границу. Но когда это не так, когда у меня проблема.

+0

Если верхняя граница не равномерно разделена на количество потоков, вы должны просто оставить последний элемент и добавить его в конце, когда вы добавите другие подтаблицы. – evanmcdonnal

+0

Можете ли вы добавить фрагмент кода? Часть на верхней границе и нижней границе довольно расплывчата. – Deyang

ответ

1

Это может быть немного вне коробки того, что ваше задание хочет сделать с границами (не уверен, что вы здесь). Но это очень простой пример того, как вы могли бы решить эту проблему с помощью фиксированного пула потоков. Сохраняет вам возможность самостоятельно управлять потоками. Вы # нити будут размером fixedThreadPool. Тогда вы можете просто создать «задания», которые добавляют два числа. Здесь вы просто добавляете последний номер, если у вас есть нечетная верхняя граница.

private static ExecutorService tpool = Executors.newFixedThreadPool(20); 
    private static final int upper = 140; 

    private static AtomicInteger total = new AtomicInteger(0); 

public static void main(String[] args) throws Exception { 

    int ar[] = new int[upper]; 
    for(int i = 1 ; i <= upper; i++){ 
     ar[i-1]=i; 
    } 

    for(int i = 1 ; i <= ((upper%2) !=0 ? (upper-1):(upper)); i+=2){ 
     final int a = ar[i-1]; 
     final int b = ar[i]; 
      Thread thread = new Thread(new Runnable(){ 
       public void run() { 
        int res = add(a, b); 
        total.addAndGet(res); 
        return; 
      }}); 
      tpool.execute(thread); 
    } 
    if(upper%2!=0) 
     total.addAndGet(ar[ar.length-1]); 

    tpool.shutdown(); //wait for everything to finish 
    System.out.println(total.get()); //get the result. 
} 

private static int add(final int a, final int b){ 
    return a+b; 
} 

Возможно это менее эффективно, если у вас было две темы, прочитывать куски массива, как вы сказали бы нить 1, чтобы добавить 1-6 и нить 2, чтобы добавить 7-12. Но это, по сути, делает то же самое, и этот подход хорошо подходит для более интенсивной вычислительной задачи.

3

Связанный: 18, Тем: 7

Используйте разделение, чтобы выяснить номинальное количество элементов на одну нить: Ops в потоке = 18/7

Используйте оператор по модулю, чтобы выяснить количество нити, которые должны получить один дополнительный элемент (для остальных): Темы с одним дополнительным = 18% 7

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