2009-12-25 28 views

Trả lời

28

Hành vi, không có gì nhiều.

Tuy nhiên, khi bạn có một phiên bản Executor, bạn có thể gửi nhiều tác vụ cho nó và thực hiện nhiều tác vụ này với nhau. Bạn không thể làm điều đó chỉ đơn giản với một số liệu Thread.

+0

Ồ đúng rồi, thậm chí không nghĩ về điều đó. Cảm ơn. –

11

Nếu một lỗi hoặc RuntimeException được ném trong Executor nó sẽ được nuốt âm thầm, các Chủ đề mới() sẽ in nó để System.err

15

Một khác biệt đáng chú ý, là khi bạn chạy new Thread(someRunnable).start(); khi Runnable xong sợi chỉ sẽ chết lặng lẽ.

Người thực thi sẽ vẫn tồn tại cho đến khi bạn tắt nó. Vì vậy, chạy Executors.newSingleThreadExecutor().execute(command) Khi bạn nghĩ rằng ứng dụng của bạn hoặc JVM có thể được hoàn thành thì Executor vẫn có thể đang chạy trong một luồng nền.

+0

Dường như không phải như vậy: https://www.farside.org.uk/201309/learning_from_bad_code – assylias

+0

Thú vị, tôi không thể tranh luận với phần lớn những gì anh ta nói. Tôi không thể tạo lại cuộc gọi 'finalize' sau khi' submit' hoàn tất. Tôi chạy một thử nghiệm 'main' đơn giản và TPE ủy nhiệm không bao giờ là GC'd. –

+0

Tôi chưa thử nghiệm thành thật. – assylias

0

Executors.newSingleThreadExecutor(). Execute (command) sẽ sử dụng lại chuỗi đã được tạo trước đó, nó sẽ không tạo chủ đề mới như trường hợp Thread mới(). Nếu chuỗi chưa được sử dụng trong sáu mươi giây bị chấm dứt, Đó là một loại nhóm chứa một chuỗi đơn lẻ làm cho nó tương đương với newFixedThreadPool (1).

0

Tôi thích sử dụng ExecutorService hoặc ThreadPoolExecutor ngay cả đối với các chuỗi chữ số đơn. Chúng cung cấp sự linh hoạt hơn.

Có một cái nhìn tại ExecutorService & ThreadPoolExecutor phần trong câu hỏi SE liên quan:

java Fork/Join pool, ExecutorService and CountDownLatch

Java's Fork/Join vs ExecutorService - when to use which?

Giả sử rằng bạn đã bắt đầu với chủ đề riêng của bạn thay vì ExecutorService. Trong tương lai, nếu có nhu cầu hỗ trợ nhiều chủ đề, ExecutorService hoặc ThreadPoolExecutor sẽ cung cấp khả năng kiểm soát và tính linh hoạt tốt hơn cho bạn. Bạn có thể tinh chỉnh số lượng tham số được yêu cầu trong các API dưới đây.

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, 
RejectedExecutionHandler handler) 
Các vấn đề liên quan