2012-04-16 11 views
5

Trong Java có cách nào để đặt mức độ ưu tiên cho chuỗi sẽ gọi phương thức doInBackground() của đối tượng SwingWorker không?Có cách nào để đặt mức độ ưu tiên của chuỗi nền được sử dụng bởi một SwingWorker không?

Trong API chủ đề, có phương thức setPriority(). Phương thức SwingWorker.execute() lập kế hoạch swingworker để thực hiện trên một chuỗi công nhân. Tôi muốn có quyền truy cập vào chuỗi công nhân đó để đặt mức độ ưu tiên của nó.

Từ sự hiểu biết của tôi, chuỗi công nhân này đến từ một hồ sơ chuỗi công nhân mặc định. Liệu cách duy nhất để xử lý việc này là sử dụng người thực thi của riêng tôi?

+4

Trừ khi bạn đang sử dụng gần 100% của tất cả các CPU của bạn, thiết lập các ưu tiên có thể không thực hiện bất kỳ sự khác biệt. Nếu bạn đang sử dụng tất cả các CPU của bạn, ưu tiên chỉ là một gợi ý mà JVM hoặc hệ điều hành là miễn phí để bỏ qua. IMHO Nó sẽ không giải quyết vấn đề của bạn. –

+0

Ứng dụng này nhắm mục tiêu cụ thể Windows và JVM là Oracle JVM chuẩn. Từ câu hỏi tràn ngăn xếp khác này, nó tạo ra một số khác biệt trong trường hợp này: http://stackoverflow.com/questions/297804/thread-api-priority-translation-to-os-thread-priority – Clinton

+0

Nó tạo sự khác biệt cho gợi ý cho hệ điều hành. Cho dù nó tạo ra bất kỳ sự khác biệt nào cả khi bạn không sử dụng tất cả cpu, là câu hỏi tôi có. AFAIK, nếu bạn có cpu dự phòng mỗi thread có thể chạy sẽ chạy bất kể ưu tiên. Nó chỉ quan trọng khi hệ điều hành phải đưa ra lựa chọn ưu tiên quan trọng. –

Trả lời

7

Các gợi ý JDK7 SwingWorker javadoc rằng các nhà thiết kế không có ý định cho người sử dụng tương tác trực tiếp với hoặc thay đổi chủ đề nền:

... the exact strategy of choosing a thread for any particular SwingWorker is unspecified and should not be relied on.

Việc thực hiện SwingWorker.getWorkersExecutorService() dường như để củng cố ý tưởng này vì họ đã thực hiện nó theo cách không dễ thay đổi.

SwingWorker là giải pháp soạn sẵn cho trường hợp điển hình và bạn không có trường hợp điển hình. Tôi muốn đề nghị bạn viết mã để xử lý chạy các tác vụ nền thay vì cố gắng để hack SwingWorker để làm những gì bạn muốn. Bằng cách đó, bất cứ ai được duy trì mã của bạn trong tương lai (thậm chí có thể là chính bạn!) Sẽ không được tự hỏi tại sao SwingWorker không hoạt động như mong đợi.

5

Cách duy nhất tôi có thể nghĩ để làm điều này là có phương pháp thực thi lấy chủ đề hiện tại bằng cách sử dụng Thread.currentThread(). Sau đó bạn có thể đặt mức độ ưu tiên của chuỗi này (miễn là người gọi được phép).

+2

Tôi nghĩ phương pháp này có thể hoạt động. 'Thread.currentThread()' nên được thực hiện trong phương thức "doInBackground()" (chuỗi công nhân). –

+1

Điều này dường như hoạt động. Tôi nghĩ rằng tôi có thể cần phải chuyển nó trở lại nó là ưu tiên mặc định ở cuối của phương pháp kể từ khi thread sẽ được trả lại cho một hồ bơi và sẽ được sử dụng cho cái gì khác. Giống như Jason Braucht, đây có thể là một thiết kế tồi. – Clinton

2

Khi SwingWorker là một Runnable, bạn có thể gửi nó cho bất kỳ java.util.concurrent.ExecutorService

+2

Nó cũng là Tương lai. –