Có thể chỉ định nhóm luồng tùy chỉnh cho luồng song song Java 8 không? Tôi không thể tìm thấy nó ở bất cứ đâu.
Hãy tưởng tượng rằng tôi có một ứng dụng máy chủ và tôi muốn sử dụng các luồng song song. Nhưng ứng dụng này lớn và đa luồng nên tôi muốn ngăn cách nó. Tôi không muốn một tác vụ chạy chậm trong một mô-đun của các nhiệm vụ chặn ứng dụng từ một mô-đun khác.
Nếu tôi không thể sử dụng các nhóm luồng khác nhau cho các mô-đun khác nhau, điều đó có nghĩa là tôi không thể sử dụng các luồng song song một cách an toàn trong hầu hết các tình huống trong thế giới thực.
Hãy thử ví dụ sau đây. Có một số nhiệm vụ chuyên sâu CPU được thực hiện trong các luồng riêng biệt. Các nhiệm vụ tận dụng các luồng song song. Tác vụ đầu tiên bị hỏng, vì vậy mỗi bước mất 1 giây (mô phỏng theo chế độ ngủ của luồng). Vấn đề là các luồng khác bị kẹt và chờ đợi nhiệm vụ bị hỏng hoàn thành. Đây là ví dụ giả định, nhưng hãy tưởng tượng một ứng dụng servlet và ai đó gửi một tác vụ chạy dài đến nhóm tham gia fork chung.
public class ParallelTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(() -> runTask(1000)); //incorrect task
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.shutdown();
es.awaitTermination(60, TimeUnit.SECONDS);
}
private static void runTask(int delay) {
range(1, 1_000_000).parallel().filter(ParallelTest::isPrime).peek(i -> Utils.sleep(delay)).max()
.ifPresent(max -> System.out.println(Thread.currentThread() + " " + max));
}
public static boolean isPrime(long n) {
return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
}
}