2010-07-06 6 views
5

Tôi muốn biết cách dừng thực hiện chức năng được chỉ định trong một thời gian xác định trong java.Có thể dừng thực thi chức năng trong một thời gian nhất định trong Java không?

Ví dụ: Tôi có thể gọi hàm có tên là print_data(). Nếu phải mất nhiều thời gian hơn để thực thi, tôi sẽ phải ngừng thực thi chức năng đó.

Có thể ngừng thực hiện như thế này không?

Cảm ơn trước

+0

Bạn có thể thực hiện chức năng này trong một sợi riêng biệt và sau đó hủy bỏ chuỗi sau một khoảng thời gian. – BobbyShaftoe

+0

xin lỗi tôi didnt sử dụng thread trong chương trình, bất kỳ khác có thể là có? –

Trả lời

4

Bạn có thể thêm một số kiểm tra chức năng của mình: lưu dấu thời gian khi chức năng bắt đầu làm việc và sau đó định kỳ kiểm tra xem bên trong hàm, ném một ngoại lệ nếu chức năng mất nhiều thời gian.

Đây là cách sạch nhất để thực hiện tác vụ như vậy trong Java.

+0

Tôi bắt đầu nghĩ về một số chuỗi hẹn giờ và một cơ chế để ngắt quá trình, nhưng nếu việc in được thực hiện trong một vòng lặp, phương pháp của bạn đơn giản và hiệu quả hơn nhiều. +1. –

2

Bạn có thể sử dụng TimeUnit enum từ java.util.concurrent, cụ thể là phương pháp timedJoin.

Bạn chỉ định thời gian chờ và chuỗi. timedJoin sẽ cho phép chuỗi của bạn thực thi cho đến khi chấm dứt hoặc ngừng nếu quá trình xử lý mất nhiều thời gian hơn thời gian chờ được phép. Bạn có thể sử dụng một lớp ẩn danh để bọc phương thức của bạn trong một đối tượng Thread dễ dàng.

Điều này có thể dễ dàng như:

SECONDS.timedJoin(
    new Thread() { 
     public void run() { 
     print_data(); 
     } 
    }, 
    10);  

cho một thời gian chờ 10 giây.

3

Không có cách nào an toàn để ngăn chặn việc thực thi luồng, trừ khi nó đang được hợp tác; ví dụ. nó thường xuyên kiểm tra cờ 'bị gián đoạn'.

@BobbyShaftoe gợi ý này trong một chú thích:

Bạn có thể thực hiện chức năng này trong một thread riêng biệt và sau đó hủy bỏ thread sau một khoảng thời gian.

Đây là lời khuyên gây hiểu lầm và nguy hiểm. Cách duy nhất để "hủy bỏ" một chủ đề là sử dụng phương pháp Thread.stop() không được chấp nhận. Nếu bạn nhìn vào javadoc cho phương pháp đó, bạn sẽ thấy rằng nó là một phương pháp cơ bản nguy hiểm có trách nhiệm có tác dụng phụ không mong muốn và không thể đoán trước.

Cũng cần lưu ý rằng giải pháp @ tonio không ngừng thực hiện chức năng. Nó chỉ dừng lại chờ đợi cho việc thực thi của hàm kết thúc. Chức năng có thể tiếp tục thực hiện vô thời hạn, nhai tài nguyên để không có hiệu quả tốt.

+0

+1 @Stephen C: Để phân biệt giữa thực sự dừng thực hiện và chỉ bỏ qua sau một thời gian chờ ceetain. – bguiz