2010-06-06 30 views
13

Tôi đang xây dựng một bảng điều khiển Sudoku Solver nơi mục tiêu chính là tốc độ thô.Làm cách nào để tái sử dụng một chuỗi trong Java?

Tôi hiện có một ManagerThread bắt đầu WorkerThreads để tính toán các neibhbors của mỗi ô. Vì vậy, một WorkerThread được bắt đầu cho mỗi ô ngay bây giờ. Làm thế nào tôi có thể tái sử dụng một chủ đề hiện có đã hoàn thành công việc của mình?

Mẫu hồ bơi chủ đề có vẻ là giải pháp, nhưng tôi không hiểu phải làm gì để ngăn chặn chuỗi chết khi công việc của nó đã hoàn tất.

ps: Tôi không mong đợi đạt được nhiều hiệu suất cho tác vụ cụ thể này, chỉ muốn thử nghiệm cách đa luồng hoạt động trước khi áp dụng cho các phần phức tạp hơn của mã.

Cảm ơn

+1

Nhiều cuộc điều tra trên như thế nào nó hoạt động: http://stackoverflow.com/questions/2324030/java-thread-reuse -stackoverflow – Eddy

Trả lời

14

Hãy xem Java SE cung cấp java.util.concurrent API. Bạn có thể tạo một threadpool bằng cách sử dụng Executors#newFixedThreadPool() và bạn có thể gửi các tác vụ bằng cách sử dụng các phương thức ExecutorService. Không cần phải tái tạo lại threadpool của riêng bạn. Xem thêm Sun tutorial on the subject.

+0

+1 (như thường lệ) ... –

+2

@David: Hãy nhớ rằng đối với các nhiệm vụ tính toán thuần túy, có nhiều chuỗi hơn số lõi có sẵn sẽ làm chậm, thay vì tăng tốc, mã của bạn. Rõ ràng là những thay đổi nếu bạn có một luồng chặn trên I/O hoặc một cái gì đó. –

+4

@ T.J. có một điểm công bằng. @David, kiểm tra ['Runtime # availableProcessors()'] (http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#availableProcessors%28%29). – BalusC

3

khi sử dụng một nhóm chủ đề (java.util.concurrent), bạn chưa bao giờ thực sự khởi tạo một luồng - mà là truyền các Runnables tới nhóm luồng. bạn không cần phải lo lắng về vòng đời của luồng, chỉ cần làm bất cứ công việc nào bạn cần làm trong runnable và để nó thoát ra khi nó được thực hiện.

0

Vâng, nếu tôi đã phải mã hóa logic này bản thân mình thay vì sử dụng một gói như Quartz từ OpenSymphony, tôi sẽ làm như sau: Tôi muốn có một WorkerThread mở rộng Thread. Lớp này cũng sẽ có thuộc tính riêng được gọi là runnable là Runnable. Thuộc tính này sẽ giữ tham chiếu đến mã bạn muốn thực thi. Có một setter công cộng cho nó. Mã chủ đề chính sẽ bắt đầu bằng cách chạy runnable mà bạn đã khởi chạy nó và sau đó chuyển sang trạng thái chờ. Trước khi làm điều đó, nó sẽ đánh dấu vào người quản lý hồ bơi mà nó đã hoàn thành và nó có thể được trả lại cho hồ bơi. Lần sau khi bạn cần một chủ đề, bạn chọn một chủ đề từ nhóm, gọi setRunnable để thiết lập thuộc tính runnable, và sau đó đánh thức luồng. Nó sẽ sinh ra trở lại làm việc, nhập vào vòng lặp vô hạn: thực hiện và chạy được và quay trở lại trạng thái chờ.

Các vấn đề liên quan