package koz01.java2.lab07;
import java.util.Collection;
import java.util.LinkedList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class TestThread {
@Test
public void testThreads() {
final ComplicatedProcess cp = new ComplicatedProcess();
Collection<Thread> threads = new LinkedList<>();
Collection<Long> durations = new LinkedList<>();
long start = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
final int threadNu = i;
Thread t = new Thread() {
@Override
public void run() {
cp.doNop(l -> durations.add(l));
};
};
t.start();
threads.add(t);
}
threads.forEach(t -> {
try {
t.join();
}
catch (InterruptedException exc) {
log.error("join", exc);
}
});
long totalDuration = System.currentTimeMillis() - start;
long maxDuration = durations.stream().mapToLong(l -> l).max().getAsLong();
log.info("duration: {}/{} ms", maxDuration, totalDuration);
}
@Test
public void testExecutors() {
for (int i = 10; i <= 10; i++) {
ExecutorService executorService = Executors.newFixedThreadPool(i);
runExecutors(executorService, i);
executorService.shutdown();
}
}
private void runExecutors(ExecutorService executorService, int threads) {
final ComplicatedProcess cp = new ComplicatedProcess();
Collection<Future<Long>> futures = new LinkedList<>();
long start = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
Future<Long> future = executorService.submit(() -> cp
.doFactorialReturnDuration());
futures.add(future);
}
Collection<Long> durations = futures.stream().map(f -> {
try {
return f.get();
}
catch (InterruptedException | ExecutionException exc) {
log.error("error", exc.getCause());
return -1l;
}
}).collect(Collectors.toList());
long totalDuration = System.currentTimeMillis() - start;
long maxDuration = durations.stream().mapToLong(l -> l).max().getAsLong();
log.info("duration for #{} executors: {}/{} ms", threads, maxDuration,
totalDuration);
}
}