2013-04-20 32 views
8

Trong Java, tôi có chức năng xử lý tệp văn bản theo một cách nhất định. Tuy nhiên, nếu phải mất quá nhiều thời gian, quá trình này rất có thể sẽ vô ích (bất kể lý do gì) cho tệp văn bản đó và tôi muốn bỏ qua nó. Hơn nữa, nếu quá trình mất quá nhiều thời gian, nó cũng sử dụng quá nhiều bộ nhớ. Tôi đã cố gắng để giải quyết nó theo cách này, nhưng nó không hoạt động:Chức năng bỏ qua nếu mất quá nhiều thời gian

for (int i = 0; i<docs.size(); i++){ 
    try{ 
     docs.get(i).getAnaphora(); 
     } 
    catch (Exception e){ 
     System.err.println(e); 
    } 
} 

nơi docs chỉ là một List các tập tin trong một thư mục. Thông thường tôi phải tự dừng mã vì nó bị 'kẹt' tại một tệp cụ thể (tùy thuộc vào nội dung của tệp đó).

Có cách nào đo thời gian cho chức năng đó và yêu cầu Java bỏ qua tệp mà hàm này mất nhiều hơn, giả sử 10 giây?

EDIT
Sau khi cạo một vài câu trả lời khác nhau cùng nhau, tôi đã đưa ra giải pháp này hoạt động tốt. Có lẽ ai đó khác cũng có thể sử dụng ý tưởng đó.

Đầu tiên tạo ra một lớp mà thực hiện Runable (cách này bạn có thể vượt qua trong lập luận cho bài viết nếu cần):

public class CustomRunnable implements Runnable { 

    Object argument; 

    public CustomRunnable (Object argument){ 
     this.argument = argument; 
} 

    @Override 
    public void run() { 
     argument.doFunction(); 
    } 
} 

Sau đó sử dụng đoạn mã này trong lớp main theo dõi thời gian của một hàm (argument.doFunction()) và thoát nếu nó mất thời gian:

Thread thread; 
for (int i = 0; i<someObjectList.size(); i++){   
    thread = new Thread(new CustomRunnable(someObjectList.get(i))); 
    thread.start(); 
    long endTimeMillis = System.currentTimeMillis() + 20000; 
    while (thread.isAlive()) { 
     if (System.currentTimeMillis() > endTimeMillis) { 
     thread.stop(); 
     break; 
    } 
    try { 
     System.out.println("\ttimer:"+(int)(endTimeMillis - System.currentTimeMillis())/1000+"s"); 
     thread.sleep(2000); 
     } 
    catch (InterruptedException t) {} 
    } 
} 

tôi nhận ra stop() được depcecated, nhưng tôi đã không tìm thấy bất kỳ cách nào khác để ngăn chặn và thoát khỏi thread khi tôi muốn nó dừng lại.

+1

Hãy xem này: [http://stackoverflow.com/questions/8982420/time-out-method-in-java][1] [1]: http://stackoverflow.com/questions/8982420/time-out-method-in-java –

+0

này đã giúp tôi đạt được giải pháp của tôi, nhờ :) – Tim

Trả lời

8

Quấn mã của bạn trong một số Runnable hoặc Callable và gửi mã cho một Người thi hành phù hợp để thực thi. Một trong các phương thức gửi mất khoảng thời gian chờ sau khi đã qua được mã bị gián đoạn.

+0

tôi đã tìm kiếm một thời gian ngắn cho các giao diện và điều này có vẻ như là câu trả lời đúng cho vấn đề. Tôi không biết làm thế nào để làm điều đó được nêu ra tuy nhiên. Tôi sẽ xem xét nó. – Tim

+0

Bạn có thể đưa ra một ví dụ không? – CMCDragonkai

0

Bạn có thể sử dụng phương pháp chạy bên trong System.nanoTime() làm điều kiện.

Ví dụ,

long cur = System.nanoTime(); //records the time when start executing 
... 
double elapsedTime(System.nanoTime() - cur)/1000000.0; // at the end 
Các vấn đề liên quan