2012-05-02 28 views
6

Tôi mới sử dụng Java và sử dụng mã do ai đó cung cấp. Ở đó, ở cuối mã, chúng sẽ làm gián đoạn một luồng nếu nó chưa hoàn thành. Tôi đang đo thời gian của mã.java: đang ngắt chuỗi hoàn toàn cần thiết

Vấn đề là mã Java đầu tiên phát hành tất cả các chủ đề, và sau đó ở cuối nó ngắt. Việc gián đoạn có cần thiết không? Chúng ta không thể chờ đợi cho đến khi tất cả các chủ đề thực sự kết thúc? Hoặc có thể chỉ bỏ qua ngắt (các luồng này đang chạy các tiến trình bằng cách sử dụng lệnh process exec và chúng sẽ kết thúc). Đây là mã có liên quan. Đầu tiên là mã cho chủ đề cá nhân:

String commandString = "./script.scr "; 
    process = Runtime.getRuntime().exec(commandString); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    while ((lsString = bufferedReader.readLine()) != null) 
     { 
      System.out.println(lsString); 
     }  
     try 
     { 
      process.waitFor(); 
     } 

Bây giờ mã của phần mà công văn này đề:

public void stopWhenAllTaskFinished() 
{ 
    while(notFinished) {sleep(50);} //notFinished is class variable and somewhere else it will set to false. 
    //now finished. 
    //Interrupt all the threads 
    for (int i=0; i<nThreads; i++) { 
     threads[i].interrupt(); 
    } 
} 

Chức năng này được gọi từ lớp học chính như:

obj.stopWhenAllTaskFinished() 

tôi rất nhiều đánh giá cao mọi thông tin chi tiết hoặc câu trả lời.

+5

Thật không may mô tả của bạn quá mơ hồ. Việc gián đoạn có thể hoặc có thể không cần thiết. Tất cả phụ thuộc vào những gì 'Thread' làm. – Frankie

+0

Tôi đã thêm mã có liên quan – user984260

+1

Thành thật mà nói nó trông giống như một kiểm tra hoang tưởng cho một cái gì đó mà không bao giờ xảy ra. – trutheality

Trả lời

1

Vẫn chưa rõ liệu các ngắt cần thiết từ mã mà bạn đã đăng.

  • Nếu notFinished được thiết lập để false khi tất cả các chủ đề đã kết thúc, sau đó ngắt là không cần thiết.

  • Nếu notFinished được thiết lập để false khi có một khả năng rằng một số chủ đề vẫn chưa hoàn tất, sau đó nó có thể là cần thiết. Cho dù điều đó có thực sự cần thiết hay không phụ thuộc vào những thứ khác:

    • Bạn đã chuẩn bị sẵn sàng để ứng dụng hoàn tất một cách tự nhiên?
    • Bạn có chắc chắn rằng các chủ đề sẽ kết thúc không? (Họ có thể treo/chặn mãi mãi không?)
    • Bạn có cần kết quả hoạt động của họ không?
    • Họ có phản hồi gián đoạn không? (Trong trường hợp này, tôi nghĩ rằng câu trả lời là "có".)
    • Có bất kỳ tác hại nào trong việc rời khỏi chủ đề ở đó không? (Ví dụ, nó có dừng ứng dụng tắt không?)
+0

1. Vâng, tôi đã chuẩn bị. 2. Có, họ sẽ hoàn thành chắc chắn. 3. Không, tôi chỉ là thời gian của ứng dụng tổng thể (mỗi nhiệm vụ thực hiện trên thread mất một thời gian, nhưng nếu bị gián đoạn: nó không phải là tốt). 4. Có 5. Tôi không biết nếu có hại. Yêu cầu duy nhất của tôi là: không có chủ đề nào bị giết trước khi kết thúc và ứng dụng tổng thể. chỉ nên kết thúc khi tất cả các chuỗi kết thúc. – user984260

+0

"Nếu notFinished được đặt thành false khi tất cả các chủ đề đã hoàn thành .." Tôi nghĩ, đó không phải là trường hợp. notFinished được thay đổi trước khi tất cả các chủ đề kết thúc – user984260

+1

Trả lời 3 có nghĩa là các ngắt có thể thực sự có hại. –

2

Mã sau đây mà Oracle cung cấp trong javadocs là những gì hầu hết mọi người làm. AFAIK, điều này được thiết kế để tiêu diệt các chủ đề từ chối tắt máy một cách duyên dáng sau khi cho họ cơ hội để tắt máy.

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

void shutdownAndAwaitTermination(ExecutorService pool) { 
    pool.shutdown(); // Disable new tasks from being submitted 
    try { 
    // Wait a while for existing tasks to terminate 
    if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { 
     pool.shutdownNow(); // Cancel currently executing tasks 
     // Wait a while for tasks to respond to being cancelled 
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) 
      System.err.println("Pool did not terminate"); 
    } 
    } catch (InterruptedException ie) { 
    // (Re-)Cancel if current thread also interrupted 
    pool.shutdownNow(); 
    // Preserve interrupt status 
    Thread.currentThread().interrupt(); 
    } 
} 
+1

Đó là cho một hồ bơi mặc dù - câu hỏi ban đầu không sử dụng một hồ bơi chủ đề –

+0

Có, mã sử dụng: tư nhân PoolWorker [] chủ đề.Bạn có thể vui lòng cho biết mã phù hợp cho điều này (hoặc trả lại ference). – user984260

+0

Xin lỗi, tôi đã đăng bài này trước khi đăng bất kỳ mã nào. Tôi sẽ xem xét câu hỏi mới. – Jon7

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