2010-08-27 4 views
6

Có vẻ như khi tôi khởi tạo 12 chuỗi công việc Swing, sáu đầu tiên bắt đầu hoàn thành nhiệm vụ của nó, nó kết thúc VÀ sau đó sáu bắt đầu và kết thúc. Các hành vi tôi đang tìm kiếm là tất cả 12 chủ đề bắt đầu làm việc cùng một lúc & kết thúc cùng một lúc.Chủ đề công nhân Swing không đồng thời

tôi có như sau:

for (int i = 0; i < 12; i++) 
{ 
     myTask m = new Mytask(i, START); 
     m.execute(); 
} 

Các myTask m sẽ tăng một thanh tiến trình 0-100 trong từng bước của 25. Tôi nhận được hành vi lạ lùng rằng sáu chủ đề đầu tiên bắt đầu incrementing, họ kết thúc tại 100, sau đó sáu chủ đề cuối cùng bắt đầu từ 0 và tăng, và kết thúc.

Có yếu tố giới hạn nào về số lượng chuỗi công việc Swing có thể có?

Trả lời

6

Hành vi tôi tìm kiếm là 12 chủ đề bắt đầu hoạt động đồng thời & kết thúc cùng một lúc.

A CountDownLatch được thiết kế cho mục đích này. Dưới đây là một tốt example sử dụng một SwingWorker và một số chủ đề phụ được điều khiển bởi chốt.

+0

mục học của tôi trong ngày :-) Chỉ không thích một khía cạnh của ví dụ: nhiệm vụ truy cập textComponent ngoài EDT (tại thời điểm đó vẫn được ghi nhận là an toàn chỉ ... mà luôn luôn được tranh cãi ...) Tóm lại: tốt hơn là không dựa vào nó và bọc trong một invokeLater – kleopatra

+0

@ kleopatra: Được phát hiện! [Ví dụ] (http://stackoverflow.com/a/3245805/230513) có một vấn đề tương tự (tiềm ẩn); phương thức 'display()' minh họa đề xuất của bạn. – trashgod

+0

Xem thêm, [ví dụ này] (http://stackoverflow.com/a/11372932/230513). – trashgod

3

Câu hỏi của bạn nói:

Các hành vi Tôi đang tìm là tất cả 12 đề bắt đầu làm việc tại cùng một thời gian & kết thúc tại cùng một thời điểm.

Nhưng bạn không thể đảm bảo cho tất cả các chuỗi công nhân Swing bắt đầu đồng thời và kết thúc cùng một lúc.

+0

Tại sao không? Lý do đằng sau điều đó là gì? –

+0

Vì chúng là Chủ đề, Và việc thực hiện các Chủ đề phụ thuộc vào nhiều facyors, cpu no., OS, các tài nguyên có sẵn, v.v. – YoK

+0

Xem câu trả lời của tôi cho một alernative. – trashgod

2

lớp SwingWorker có một trường ExecutorService tĩnh với MAX_WORKER_THREADS = 10. Tôi không chắc chắn lý do tại sao bạn thấy 6 và không 10. Nhưng bạn không thể đi qua 10.

/** 
    * number of worker threads. 
    */ 
    private static final int MAX_WORKER_THREADS = 10; 

...

executorService = 
       new ThreadPoolExecutor(1, MAX_WORKER_THREADS, 
             10L, TimeUnit.MINUTES, 
             new LinkedBlockingQueue<Runnable>(), 
             threadFactory); 
+0

Tôi có thể thay đổi thủ công # của MAX_WORKER_THREADS hoặc không thể? Lý do của việc có một số arbritrary gồm 10 chủ đề là gì? –

+0

Không, bạn không thể thay đổi số MAX_WORKER_THREADS vì đây là trường cuối cùng. Đối với lý do, bạn cần phải hỏi Igor Kushnirskiy (tác giả của lớp). –

+1

Bạn có thể sử dụng ExecutorService của riêng bạn để thực thi SwingWorkers, vì chúng tương lai – keuleJ