2014-12-17 17 views
6

Tôi có một Chủ đề sẽ chạy một lib của bên thứ ba cũng sẽ chạy Chủ đề của riêng họ. Khi phương thức chạy của Thread của tôi kết thúc, Chủ đề của bên thứ ba sẽ không được hoàn thành.Java - Chờ cho các chủ đề của bên thứ ba kết thúc

Vì vậy, cách tốt nhất để giữ chủ đề của tôi cho đến khi các Chủ đề bên ngoài này vẫn đang chạy là gì?

+0

Bạn cần một số tham chiếu để chờ. Chẳng hạn như Chủ đề, Tương lai hoặc khả năng cài đặt gọi lại. Nếu thư viện không vạch trần điều đó, nó sẽ rất khó ... Có lẽ bạn có thể thăm dò ý kiến ​​mỗi giây X? – Thilo

+0

Tôi có thể thăm dò ý kiến, nhưng làm sao tôi biết họ đã kết thúc? Tôi có thể "gián điệp" các chủ đề được tạo ra sau của tôi không? – bsferreira

+0

Tôi có nghĩa là cuộc thăm dò cho đến khi bạn thấy một cái gì đó cho bạn biết rằng những chủ đề này đã làm bất cứ điều gì họ cần làm. Bạn có chắc chắn thư viện không cung cấp hỗ trợ cho một số loại thông báo không? Bạn có thể nhận được câu trả lời tốt hơn nếu bạn có thể cho chúng tôi biết thư viện này là gì. – Thilo

Trả lời

4

Nếu bạn là một ứng dụng và không cần phải lo lắng về việc hạn chế SecurityManager, và nếu bạn đang chuẩn bị để thỉnh thoảng thay đổi mã của bạn khi mã của bên thứ ba được cập nhật, bạn có thể sử dụng các cơ sở của ThreadGroup để đi bộ các chủ đề và xác định chúng theo tên hoặc theo nhóm chủ đề có chứa chúng.

Khi bạn đã xác định được các chủ đề đó là một công việc đơn giản để theo dõi chúng cho đến khi chúng được thực hiện hoặc sử dụng Thread.join() khi thích hợp.

Như một ví dụ, đây là một số mã làm việc mà bãi tất cả các chủ đề trong JVM:

public void printThreads(PrintWriter wtr) { 
    ThreadGroup  root; 

    totGroups=0; 
    totThreads=0; 

    for(root=Thread.currentThread().getThreadGroup(); root.getParent()!=null; root=root.getParent()) {} 
    wtr.println("Thread Dump:"); 
    printThreadGroup(wtr,root," "); 
    wtr.println(" -- Total Groups: "+totGroups+", Total Threads: "+totThreads); 
    } 

public void printThreadGroup(PrintWriter wtr, ThreadGroup grp, String pfx) { 
    try { 
     Thread[]  thds; 
     ThreadGroup[] grps; 

     totGroups++; 
     wtr.println(pfx+"Group: "+grp.getName()+", "+(grp.isDaemon()?"Daemon":"Normal")+", "+(grp.isDestroyed()?"Destroyed":"Alive")+", "+grp.getMaxPriority()); 
     thds=new Thread[grp.activeCount()]; 
     grp.enumerate(thds,false); 
     Arrays.sort(thds,THREAD_SORTER); 
     for(int xa=0; xa<thds.length && thds[xa]!=null; xa++,totThreads++) { 
      Thread   thd=thds[xa]; 
      wtr.println(pfx+". - ["+thd.getName()+", "+(thd.isDaemon()?"Daemon":"Normal")+", "+(thd.isAlive()?"Alive":"Not Started or Dead")+", "+thd.getPriority()+"]"); 
      } 

     grps=new ThreadGroup[grp.activeGroupCount()]; 
     grp.enumerate(grps,false); 
     Arrays.sort(grps,GROUP_SORTER); 
     for(int xa=0; xa<grps.length && grps[xa]!=null; xa++) { 
      printThreadGroup(wtr,grps[xa],(pfx+". ")); 
      grps[xa]=null; 
      } 
     } 
    catch(Throwable thr) { 
     wtr.println(" Cannot print threads ("+thr+")"); 
     } 
    } 

public void printStacks(PrintWriter wtr) { 
    wtr.println("Thread Stack Traces:"); 
    try { javaMx.printStacks(wtr); } catch(Throwable thr) { wtr.println(" Cannot print stacks ("+thr+")"); } 
    wtr.println(" --"); 
    } 
0

Hãy xem xét việc tạo một bộ Thread, có thể là AbstractList<Thread>. Bất cứ khi nào bạn tạo một Thread mới, bạn thêm nó vào bộ của bạn. Khi cha mẹ của bạn Thread muốn để kết thúc công việc của mình, làm điều gì đó như:

for (int i = 0; i < childrenThreads.size(); i++) { 
    childrenThreads.get(i).join(); 
} 

Tôi hiểu rằng ý tưởng này, bản thân nó chỉ giải quyết việc hoàn tất các trẻ em Threads, nhưng nếu bạn sử dụng cơ chế tương tự cho các trẻ em Thread s và con cái của họ và như vậy, thì

childrenThreads.get(i).join(); 

sẽ chờ cho i'th con Thread, mà lần lượt sẽ đợi cho con của nó Threads trong một chờ bắc cầu.

+0

Tôi hiểu những gì bạn đang làm, nhưng tôi không trực tiếp tạo ra đứa trẻ. Tôi chỉ nói cho Thread của tôi chạy và nó sẽ là libs được gọi bên trong phương thức chạy mà thực sự sẽ tạo ra các Threads của riêng chúng. – bsferreira

4

Tôi có một chủ đề mà sẽ chạy một lib bên thứ ba mà cũng sẽ chạy Chủ đề của riêng họ.

@Lawrence Dol của câu trả lời giải thích mà bạn có thể sử dụng ThreadGroup để đi qua cây nhóm và tìm chủ đề sống ... cung cấp ứng dụng của bạn không được sandboxed. Sau đó, bạn có vấn đề về việc tìm ra chủ đề nào thuộc về thư viện của bên thứ ba, nhưng có một cơ hội tốt để bạn có thể làm điều này một cách heuristically; ví dụ. dựa trên tên luồng.

Nhưng điểm tôi muốn làm là một thư viện mà cháy lên đề nền để làm việc, và cung cấp không có cách nào để chờ đợi cho công việc đến cuối được thiết kế kém:

  • tôi muốn nhìn tại API spec cho thư viện để xem liệu nó đã cung cấp giải pháp riêng của mình cho điều này chưa; ví dụ. một phương thức "shutdown" chờ các luồng công nhân kết thúc.

  • Nếu không, hãy liên hệ với người bảo trì thư viện và hỏi họ cách giải quyết tình huống. "Cách giải quyết" với các nhóm luồng là một hack dễ vỡ.

  • Nếu điều đó không mang lại kết quả và nếu thư viện là nguồn mở, hãy xem xét mã hóa nâng cao API và gửi nó dưới dạng bản vá.

0

Có lẽ không phải là một câu trả lời cho câu hỏi của bạn, nhưng nếu tôi đã viết một thư viện mà tạo chủ đề, tôi sẽ

A) Sử dụng một ThreadFactory để tạo ra chúng, và cung cấp một phương tiện cho khách hàng của tôi để cung cấp Ví dụ ThreadFactory và

B) Cung cấp phương thức .shutdown() (hoặc một số tên tương tự) để tắt mọi thứ một cách rõ ràng và không trả lại cho đến khi tất cả các chuỗi đã chết.

Tôi không biết về thư viện mà bạn đang sử dụng.

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