이 코드는 매우 느리게 실행됩니다. 스레드를 버렸고 거의 한 스레드가 동시에 실행되지만 ExecutorService
을 ForkJoinPool
으로 변경하면 코드가 매우 빠르게 실행됩니다. 스레드가 기다리고있는 이유는이 코드에서 어떤 실제 결론을 도출 꽤 어렵다 ... 내 컴퓨터는 8 개의 코어를 가지고,스레드는 ThreadPoolExecutor에서 대기 중입니다
public class Tests {
public static void main(String[] args) throws InterruptedException {
int NUM_OF_THREADS = 8;
int NUM_OF_INCREMENTS = 100_000_000;
//ExecutorService service = Executors.newWorkStealingPool();
ExecutorService service = Executors.newFixedThreadPool(NUM_OF_THREADS);
final Counter counter = new StupidCounter();
long before = System.currentTimeMillis();
for (int i = 0; i < NUM_OF_INCREMENTS; i++) {
service.submit(newCounterClient(counter, i));
}
service.shutdown();
service.awaitTermination(1, TimeUnit.MINUTES);
long end = System.currentTimeMillis();
System.out.println(end - before);
System.out.println(counter.getCounter());
}
static class CounterClient implements Runnable {
private Counter counter;
private int num;
public CounterClient(Counter counter, int num) {
this.counter = counter;
this.num = num;
}
@Override
public void run() {
counter.increment();
}
}
static interface Counter {
void increment();
long getCounter();
}
static class StupidCounter implements Counter {
long i = 0;
@Override
public void increment() {
i++;
}
@Override
public long getCounter() {
return i;
}
}
}
"pool-1-thread-7" #17 prio=5 os_prio=31 tid=0x00007faaa481c000 nid=0x6503 waiting on condition [0x0000700001d6d000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006c006b3d8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)
at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:439)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(617Thread.java:745)