2011-08-09 34 views
6

tôi phải viết một "Cơ quan giám sát" trong Java, những người bảo đảm các Chủ đề đó không hoạt động quá lâu. Với sự khởi tạo của các đối tượng không có vấn đề gì, tôi đã tạo ra một Class, người gọi WatchDog và constructor với các phản xạ trong phương thức run().Làm thế nào để bảo mật các phương thức trong java (tràn và vv)

Chủ đề có thể dễ dàng dừng lại, nhưng làm cách nào tôi có thể bảo mật các phương thức thông thường của đối tượng? Ví dụ tôi gọi phương pháp của một đối tượng và phương pháp này thực hiện một vòng lặp vô tận, làm thế nào bạn sẽ làm điều đó?

nhờ

+0

Có thể các khía cạnh sẽ làm gì? –

+0

"Chủ đề dễ dừng", không, không phải. Tôi không hiểu "làm thế nào tôi có thể bảo đảm phương pháp bình thường của các đối tượng?", Không phải là ví dụ mà sau với vòng lặp vô tận. – toto2

+0

http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html Đọc tất cả điều đó và sau đó kiểm tra xem bạn vẫn muốn gọi dừng(). Có lẽ một số suy nghĩ bên ngoài của hộp ngôn ngữ là cần thiết để làm việc xung quanh vấn đề của bạn. – RichColours

Trả lời

3

phương pháp bình thường của đối tượng đang chạy trên một số chủ đề. Nó có thể là bộ điều phối sự kiện AWT hoặc bất cứ điều gì nó được gọi. Hoặc nó có thể là chủ đề chính của ứng dụng giao diện điều khiển.

Chúng không khác với các chuỗi được gọi với Thread mới().

Tôi đoán cơ quan giám sát của bạn cần phải xem xét tất cả các chủ đề trong VM và tìm kiếm những người có sử dụng> = một số ngưỡng.

Mã nào bạn có cho đến thời điểm này?

Giàu

+0

okey, có lẽ tôi mô tả nó sai, tôi cho watchdog của tôi tất cả các chủ đề tôi muốn quan sát. Tôi chỉ muốn khởi tạo đối tượng và chạy mọi phương thức trong một chuỗi và đưa chuỗi đó vào cơ quan giám sát của tôi. – Nicolas

+0

Hi Nicolas Bạn có thể làm rõ điều này không? Cụ thể là "Tôi chỉ muốn khởi tạo Object và chạy mọi phương thức trong một luồng, và đưa chuỗi đó cho cơ quan giám sát của tôi." phần. Tôi có thể giúp đỡ, nhưng tôi không hiểu bạn đang làm gì. – RichColours

+0

Đây là mã của tôi cho một trường hợp bảo mật và một phương pháp bảo mật gọi: http://pastebin.com/v8kdvdUW Hy vọng bạn có thể hiểu những gì tôi muốn làm. – Nicolas

4

Trước tiên, tôi phải chỉ ra rằng ngăn chặn một sợi là KHÔNG dễ dàng. Trong thực tế, trong trường hợp chung, đề không thể dừng lại một cách an toàn:

  • Bạn có thể gọi Thread.interrupt() trên một sợi mà bạn muốn dừng lại, nhưng không có gì bảo đảm rằng các chủ đề sẽ nhận thấy sự gián đoạn, hãy để một mình thực sự dừng lại.

  • Bạn có thể gọi phương thức Thread.stop() không được chấp nhận, nhưng phương pháp này không an toàn. Nếu bạn gọi nó tại một thời điểm không may, bạn có thể để lại cấu trúc dữ liệu trong trạng thái được cập nhật một nửa, để lại các chủ đề khác chờ đợi (bao giờ hết) trên các tín hiệu sẽ không đến và vân vân.


Đây là cách tôi muốn thực hiện một cơ quan giám sát để thực hiện phương pháp.

Trước tiên tôi muốn sửa đổi phương thức để thêm hai lệnh gọi đến dịch vụ giám sát; ví dụ.

public void someMethod(...) { 
    Watchdog.startMethod(maxTime); 
    // do stuff 
    Watchdog.endMethod(); 
} 

Tiếp theo, tôi muốn thực hiện Watchdog với một hàng đợi ưu tiên đặt hàng đúng thời hạn hết hạn:

  1. Các startMethod(maxTime) sẽ thêm một mục vào hàng đợi với thời gian hết hạn của now + maxTime. Mục nhập sẽ bao gồm một tham chiếu đến chuỗi hiện tại (khi phương thức được gọi là
  2. endMethod() sẽ tìm mục nhập hàng đợi() cho chuỗi hiện tại và xóa nó nếu tìm thấy.
  3. Chủ đề bộ theo dõi định kỳ Nếu mục nhập đó có thời hạn ít hơn 'bây giờ', cơ quan giám sát sẽ loại bỏ mục nhập, dừng chủ đề của nó và kiểm tra mục nhập tiếp theo. Lặp lại cho đến khi mục nhập tiếp theo không hết hạn.

Một số suy nghĩ cần phải được cung cấp cho cấu trúc dữ liệu và để xử lý các trường hợp trong đó endMethod cuộc gọi bị bỏ qua. (Trên thực tế, kể từ khi một cuộc gọi phương pháp có thể chấm dứt do một ngoại lệ, các cuộc gọi endMethod() thực sự cần phải được thực hiện trong một khối finally.)

Lưu ý rằng startMethodendMethod cuộc gọi có thể (và có lẽ nên) được chèn vào bởi một chú thích bộ xử lý hoặc một cái gì đó như thế.


Do sự phức tạp, và thực tế là bạn không thể đảm bảo để ngăn chặn các chủ đề (an toàn), tôi muốn nghĩ về một số giải pháp mà không liên quan đến một cơ quan giám sát phương pháp.

+0

Đây là cách giải quyết vấn đề chính xác. Không biết tại sao nó không được chọn làm câu trả lời. Nếu ai đó muốn ra khỏi giải pháp hộp thử @ Timeable như @ yegor256 trình bày. Nhưng nó không giải quyết được vấn đề "Làm sạch sau khi gián đoạn". Cá nhân tôi vẫn sẽ viết khía cạnh của riêng tôi. –

1

Cố gắng sử dụng @Timeable chú thích từ jcabi-aspects:

public class Resource { 
    @Timeable(limit = 5, unit = TimeUnit.SECONDS) 
    public String load(URL url) { 
    return url.openConnection().getContent(); 
    } 
} 

phương pháp của bạn sẽ bị gián đoạn khi quá hạn.

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