tôi không có cách nào để giải thích thế này, nhưng tôi thấy hiện tượng này trong mã của người khác:SecurityException từ I/O mã trong một dòng song song
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.util.stream.Stream;
import org.junit.Test;
public class TestDidWeBreakJavaAgain
{
@Test
public void testIoInSerialStream()
{
doTest(false);
}
@Test
public void testIoInParallelStream()
{
doTest(true);
}
private void doTest(boolean parallel)
{
Stream<String> stream = Stream.of("1", "2", "3");
if (parallel)
{
stream = stream.parallel();
}
stream.forEach(name -> {
try
{
Files.createTempFile(name, ".dat");
}
catch (IOException e)
{
throw new UncheckedIOException("Failed to create temp file", e);
}
});
}
}
Khi chạy với người quản lý an ninh được kích hoạt, chỉ đơn thuần gọi parallel()
trên luồng hoặc parallelStream()
khi nhận luồng từ bộ sưu tập, dường như đảm bảo rằng tất cả các nỗ lực thực hiện I/O sẽ ném SecurityException
. (Nhiều khả năng, kêu gọi bất kỳ phương pháp mà thể ném SecurityException
, sẽ ném.)
Tôi hiểu rằng parallel()
có nghĩa là nó sẽ được chạy trong thread khác mà có thể không có đặc quyền tương tự như những gì chúng tôi bắt đầu với , nhưng tôi đoán tôi nghĩ rằng khuôn khổ sẽ chăm sóc điều đó cho chúng tôi.
Xóa cuộc gọi tới parallel()
hoặc parallelStream()
trong suốt quá trình mã hóa tránh rủi ro. Chèn AccessController.doPrivileged
cũng sửa lỗi, nhưng không an toàn với tôi, ít nhất là không phải trong mọi tình huống. Có lựa chọn nào khác?
Vui lòng cung cấp dấu vết ngăn xếp của ngoại lệ bạn nhận được –
Đồng thời, vui lòng thêm mã 'SecurityManager' để chúng tôi có thể tái tạo chính xác vấn đề của bạn. –
Điều này có thể thực hiện với các luồng song song bằng cách sử dụng chung pool join. Làm thế nào nó hoạt động [nếu bạn cung cấp hồ bơi của riêng bạn] (http://stackoverflow.com/a/22269778/829571)? – assylias