2016-05-12 4 views
0

Я попытался добавить 1 к «глобальному счетчику» по каждой теме. Таким образом, результат «глобального счетчика» должен быть равен 10. Я распечатываю каждый результат каждой нити. В большинстве случаев последним результатом является 10. но некоторое время 10 не является последним числом. Я использовал синхронизацию или блокировку, но не работал.начинающий | threadPool | распечатать каждый результат | неправильный результат

спасибо. Надеюсь, мой английский не так уж плох.

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

public class Hauptprogramm { 

public static final int MAX_THREADS = 10; 
public static int globalCounter; 

public static void main(String[] args) { 

// create a pool of threads, 10 max jobs will execute in parallel 
ExecutorService threadPool = Executors.newFixedThreadPool(MAX_THREADS); 

// submit jobs to be executing by the pool 
for (int i = 0; i < MAX_THREADS; i++) { 
    threadPool.submit(new Runnable() { 

    public void run() { 
     // some code to run in parallel 
     globalCounter++; 


     String originalName = Thread.currentThread().getName(); 
     System.out.println("Result: "+globalCounter+" "+originalName); 


     try { 
     Thread.sleep(1000); 

     } catch (InterruptedException e) { 

     } 

    } 
    }); 
} 
    threadPool.shutdown(); 
    } 
} 
+0

печати выход в вопросе –

+0

результатом является случайным. вот так: Результат: 5 pool-1-thread-1 Результат: 6 pool-1-thread-6 Результат: 5 pool-1-thread-4 Результат: 5 pool-1-thread-2 Результат: 5 pool-1-thread-3 Результат: 5 pool-1-thread-5 Результат: 7 pool-1-thread-7 Результат: 8 pool-1-thread-8 Результат: 9 pool-1-thread- 9 Результат: 10 pool-1-thread-10 – Cashew

+1

Это ожидаемый результат без синхронизации. – Fildor

ответ

1

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

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

+0

i добавлено \t synchronized (Hauptprogramm.class) {...} Достаточно ли этого? результат теперь 1 2 3 4 5 ... 10. кажется слишком легким – Cashew

+0

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

+0

Согласен;) мы можем * command *, но не можем * заставить * JVM. + 1_ –

0

я думаю, что это прямо сейчас:

  public void run() { 
       synchronized(Hauptprogramm.class) 
        { 


       globalCounter++; 

       String originalName = Thread.currentThread().getName(); 
       System.out.println("Result: " + globalCounter + " " + originalName); 

       try { 
        Thread.sleep(100); 

       } catch (InterruptedException e) { 

       } 

        } 
      }}); 
     } 

    threadPool.shutdown(); 
} 
} 
+0

Фактически, это будет плохой выбор области синхронизации. Вы хотите сохранить синхронизированные блоки как можно меньше (но до тех пор, пока это необходимо). Подумайте: что здесь является критическим ресурсом? - globalCounter.Поэтому вы должны синхронизировать только ту часть, где используется globalCounter. Как и в случае, нить никогда не будет иметь параллельных частей (или почти почти нет), поэтому вы могли бы также увеличивать счетчик только на одном потоке. – Fildor

+0

@Fildor Но он не работает, когда я не синхронизирую часть try-catch – Cashew

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