das Thema, das ich den Code geschrieben haben, zu prüfen:, wie das Pool überprüfen ‚wieder verwendet‘ Thema
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();
}
}
Wie Sie ich HashSet<Thread>
Seine Verwendung nur richtig sein, wenn Faden unveränderlich verwenden sehen können. zumindest innerhalb des Tests.
Wie ich verstehe, ist equals/hashCode nicht überschrieben und somit von Object erben.
So, bitte antworte, wenn mein Test falsch ist und wo Fehler ist.
Wenn Sie kluger Weg wissen, bitte teilen Sie dies.
Können Sie weiter zu erklären, welches Problem Sie begegnen? Ihr Code läuft in meinem Projekt einwandfrei. – Henrik
@Henrik Ich bin mir nicht sicher, ob ich richtig erklaere, wie thread poll 'Threads wiederverwendet' – gstackoverflow
Ich würde behaupten, dass Ihr Code es tatsächlich schafft, zu verifizieren, dass 'test()' 100 Threads erstellt und 500 kleine Tasks ausführt. Ihre 'RunTimeException's würden geworfen, wenn das nicht der Fall war. Suchen Sie nach kürzeren Wegen, dies zu beweisen? – Henrik