2013-03-12 28 views
20

Tôi có một ứng dụng đa luồng và tôi gán một tên duy nhất cho mỗi luồng qua thuộc tính setName(). Bây giờ, tôi muốn chức năng truy cập trực tiếp vào các chủ đề với tên tương ứng của họ.Nhận chủ đề theo tên

Somethings như các chức năng sau:

public Thread getThreadByName(String threadName) { 
    Thread __tmp = null; 

    Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); 
    Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]); 

    for (int i = 0; i < threadArray.length; i++) { 
     if (threadArray[i].getName().equals(threadName)) 
      __tmp = threadArray[i]; 
    } 

    return __tmp; 
} 

Các kiểm tra chức năng trên tất cả các chủ đề chạy và sau đó trả về chủ đề mong muốn từ tập hợp các đề chạy. Có lẽ chuỗi mong muốn của tôi bị gián đoạn, khi đó hàm trên sẽ không hoạt động. Bất kỳ ý tưởng về cách kết hợp chức năng đó?

+2

như thế nào các chủ đề được tạo ra? –

+2

Chỉ cần lưu trữ các chủ đề bạn cần trong một 'HashMap ' bằng tên của chúng. – millimoose

+0

@JohnVint Chủ đề được tạo trong một lớp khác, vì vậy đó là lý do tại sao tôi không thể truy cập trực tiếp vào chúng. – NullPointer

Trả lời

17

Bạn có thể tìm thấy tất cả hoạt động đề sử dụng ThreadGroup:

  • Nhận thread group hiện tại của bạn
  • Làm việc theo cách của bạn lên hệ thống phân cấp ThreadGroup bằng cách gọi ThreadGroup.getParent() UNT il bạn tìm thấy một nhóm có cha mẹ trống.
  • Gọi ThreadGroup.enumerate() để tìm tất cả các chuỗi trên hệ thống.

Giá trị của việc này hoàn toàn thoát khỏi tôi ... bạn sẽ làm gì với chuỗi được đặt tên? Trừ khi bạn đang phân lớp Thread khi bạn nên triển khai Runnable (đó là lập trình cẩu thả để bắt đầu).

+0

Một trường hợp sử dụng cho việc này là tìm chuỗi biến cục bộ (có nghĩa là không thể nhận được nó) trong thư viện của bên thứ ba (có nghĩa là mã nguồn không thể sửa đổi dễ dàng). họ không cho phép đăng nhập khi một ngoại lệ được ném vào đây). Đây là một trường hợp rất đặc biệt, nhưng có trường hợp cạnh cho tình huống này. – Jyro117

+0

Trong trường hợp của tôi, tôi đang sử dụng nó để viết một bài kiểm tra đơn vị để gỡ lỗi một sợi với vấn đề an toàn thread-nghi ngờ. Các chủ đề trong câu hỏi thực hiện Runnable, nhưng câu hỏi là: câu trả lời thay thế là gì? Làm thế nào để bạn có được một Runnable cụ thể theo tên? –

5

Tôi thích ý tưởng HashMap tốt nhất, nhưng nếu bạn muốn giữ lại Set, bạn có thể lặp qua các Set, chứ không phải là tiếp tục thiết lập chuyển đổi thành một mảng:

Iterator<Thread> i = threadSet.iterator(); 
while(i.hasNext()) { 
    Thread t = i.next(); 
    if(t.getName().equals(threadName)) return t; 
} 
return null; 
+1

Điều này giống như ví dụ trên, sẽ không hoạt động nếu chuỗi bị gián đoạn! – NullPointer

12

Một lần lặp của câu trả lời của Pete ..

public Thread getThreadByName(String threadName) { 
    for (Thread t : Thread.getAllStackTraces().keySet()) { 
     if (t.getName().equals(threadName)) return t; 
    } 
    return null; 
} 
+0

Có thể là nhiều chủ đề. –

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