Чтобы проверить эту тему я написал код:Как проверить, что бассейн «повторно» тему
public class ThreadPoolTest {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 100; i++) {
if (test() != 5 * 100) {
throw new RuntimeException("main");
}
}
test();
}
private static long test() throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(100);
CountDownLatch countDownLatch = new CountDownLatch(100 * 5);
Set<Thread> threads = Collections.synchronizedSet(new HashSet<>());
AtomicLong atomicLong = new AtomicLong();
for (int i = 0; i < 5 * 100; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
try {
threads.add(Thread.currentThread());
atomicLong.incrementAndGet();
countDownLatch.countDown();
} catch (Exception e) {
System.out.println(e);
}
}
});
}
executorService.shutdown();
countDownLatch.await();
if (threads.size() != 100) {
throw new RuntimeException("test");
}
return atomicLong.get();
}
}
Как вы можете видеть, я использую HashSet<Thread>
Его использование будет правильно, только если Thread неизменны. по крайней мере, в рамках теста.
Как я понимаю, equals/hashCode не переопределяется и, таким образом, наследуется от Object.
Таким образом, ответьте, если мой тест неверен и где ошибка.
Если вы знаете более умный способ, поделитесь этим.
Можете ли вы объяснить, кроме того, что проблема Вы сталкиваетесь? Ваш код отлично работает в моем проекте. – Henrik
@Henrik Я не уверен, что я правильно понял, как потоковый опрос «повторяет» потоки – gstackoverflow
Я бы сказал, что ваш код действительно проверяет, что 'test()' создает 100 потоков и выполняет 500 небольших задач, используя их. Ваше 'RunTimeException' будет выброшено, если это не так. Вы ищете более короткие способы доказать это? – Henrik