2011-01-18 35 views
5

Tôi có một ứng dụng Java tải xuống thông tin (Thực thể) từ máy chủ của chúng tôi. Tôi sử dụng chuỗi Tải xuống để tải xuống dữ liệu.Quản lý luồng và luồng ứng dụng Java

Dòng chảy của quá trình tải về như sau:

  1. Đăng nhập - Thực thể sử dụng được tải về
  2. Dựa trên Entity dùng, tải về một danh sách 'cộng đồng' thực thể và hiển thị trong danh sách thả xuống
  3. Dựa trên cộng đồng thả xuống lựa chọn, Tải về và hiển thị 'Org Tree' trong một JTree
  4. Dựa trên lựa chọn Node, tải loại thực thể và hiển thị trong danh sách thả xuống
  5. Dựa trên loại selecti trên, tải Sub Thể loại thực thể và hiển thị trong danh sách thả xuống
  6. Dựa trên Sub Thể loại lựa chọn tải một dữ liệu lớn thiết lập và lưu nó

Việc tải xuống trong một thread để GUI không 'đóng băng'. Nó cũng cho phép tôi cập nhật Progress Bar.

Tôi cần trợ giúp quản lý quy trình này. Vấn đề chính là khi tôi tải xuống dữ liệu thực thể, tôi phải tìm cách đợi chuỗi kết thúc trước khi cố gắng lấy thực thể và chuyển sang bước tiếp theo trong luồng ứng dụng.

Cho đến nay tôi đã sử dụng hộp thoại phương thức để kiểm soát luồng. Tôi bắt đầu các chủ đề, bật lên một phương thức và sau đó xử lý các phương thức khi thread được hoàn thành. Các phương thức/thread là Observer/Observable thread có một bộ thay đổi khi nó được hoàn thành và hộp thoại disposes. Hiển thị một phương thức có hiệu quả ngăn chặn luồng ứng dụng để nó có thể đợi cho quá trình tải xuống hoàn tất.

Tôi cũng đã thử chuyển tất cả luồng công việc sang Trình theo dõi. Tất cả các GUI có liên quan trong quá trình này là Observers. Mỗi phương thức cập nhật chờ cho quá trình tải xuống hoàn tất và sau đó gọi phần tiếp theo của GUI mà bản tải xuống của riêng nó.

Cho đến nay tôi đã tìm thấy hai phương pháp này tạo ra mã khó theo dõi. Tôi muốn 'tập trung' luồng công việc này để các nhà phát triển khác không rút tóc ra khi họ cố gắng theo dõi nó.

Câu hỏi của tôi là: Bạn có bất kỳ đề xuất/ví dụ nào trong đó luồng công việc như vậy có thể được quản lý theo cách tạo mã dễ theo dõi không?

Tôi biết 'dễ' là một thuật ngữ tương đối và tôi biết cả hai tùy chọn của tôi đã hoạt động nhưng tôi muốn nhận một số ý tưởng từ các lập trình viên khác trong khi vẫn còn thời gian để thay đổi.

Cảm ơn bạn rất nhiều.

Trả lời

0

Tôi nghĩ rằng phương pháp phổ biến nhất để làm điều này trong các phiên bản gần đây của Java là sử dụng SwingWorker:

http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

Nó cho phép bạn bắn ra nhiệm vụ nền và cung cấp cho bạn một phương pháp thuận tiện thực hiện() mà thực hiện trên Swing EDT.

0

Bạn phải tạo "mô hình" cho chế độ xem của mình, thể hiện trạng thái hiện tại của ứng dụng của bạn. Đối với một cây, ví dụ: nó là hợp lý để hiển thị một "Đang tải" -node khi ai đó mở một treenode, bởi vì người khác GUI treo trên mở một nút.

Nếu chuỗi tải kết thúc tải nút, nút "Tải" được thay thế bằng kết quả của hành động không đồng bộ.Điều này làm cho nó dễ dàng mở nhiều nút song song, bởi vì các luồng công nhân chỉ chịu trách nhiệm cho một nút con duy nhất.

Tương tự khi tải xuống nội dung nào đó: Người lao động sau đó cập nhật tiến trình tải xuống. Hộp thoại tải xuống của Firefox xuất hiện ở đây.

GUIs không dễ dàng :).