2013-10-22 16 views
7

Tôi có một lớp mà là một người nghe cho các tin nhắn đến và nên được sống mãi mãi (để nó có thể nghe tin nhắn gửi đến) cho đến khi tôi ngắt kết nối một cách rõ ràng cho nó. Tôi đã khai báo thread là setDaemon (false) nhưng nó kết thúc bằng cách gọi phương thức chấm dứt.Làm thế nào để giữ cho chủ đề nghe Alive

Xin vui lòng cho tôi biết làm thế nào để giữ cho thread đó còn sống và cũng xin vui lòng ném một số ánh sáng về cách thực hiện Spring TaskExecutor để đạt được như vậy.

Xin cảm ơn trước. nó là một người nghe nó được thông báo khi ai đó gửi tin nhắn ... vì vậy làm thế nào để tôi giữ cho nó chạy?

The Listener Lớp

public class MyListnerImpl implements Listener { 
    private final connectionImpl con; 

    public MyListnerImpl(ConnectionImpl con) { 
    if (con.isAuthenticated() && con.isConnected()) { 
     if (logger.isInfoEnabled()) { 
      logger.info("Initializing XmppListner:"); 
     } 
     this.itsCon = con; 
     Thread t1 = new Thread(this); 
     t1.setDaemon(false); 
     t1.start(); 
    } 
    } 

    public final void listnerInterfaceMethod(final Chat chat, final Message message) { 
     System.out.println("Message" + message); 
    } 

    public final void run() { 
    itsCon.getChatManager().addChatListener(new ChatManagerListener() { 
     public void chatCreated(final Chat chat, final boolean createdLocally) { 
      if (!createdLocally) { 
       chat.addMessageListener(itsFbml); 
      } 
     } 
    }); 
    } 
} 

lớp gọi đơn giản là tạo ra đối tượng của nó và chủ đề được bắt đầu bởi các nhà xây dựng Listeners.

Tôi muốn giữ luồng này được tạo cho đến khi tôi ngắt nó.

+0

bạn có thể đăng mã của mình không? – Rajj

+0

có thể trùng lặp của [Làm thế nào để bạn treo một chuỗi trong Java trong một dòng?] (Http://stackoverflow.com/questions/3203139/how-do-you-hang-a-thread-in-java-in-one -line) – SSP

+0

Tôi đã đăng chủ đề, quý ông hãy cho tôi biết những gì các bạn thường làm để giữ người nghe chạy? –

Trả lời

2

Có một vài điều bạn có thể làm điều đó sẽ tốt hơn so với treo sợi ban đầu mãi mãi:

Sử dụng otherThread.join(). Điều này sẽ làm cho luồng hiện tại bạn đang chạy vào giấc ngủ cho đến khi luồng khác đã hoàn thành việc thực thi. Như @nanda gợi ý, hãy sử dụng ExcecutorService.shutdown() để đợi cho đến khi một nhóm chủ đề hoàn tất. Sử dụng otherThread.setDaemon(false) và chỉ cần để thoát khỏi chuỗi ban đầu của bạn. Điều này sẽ đặt chủ đề mới của bạn làm chủ đề người dùng. Java sẽ không tắt cho đến khi các luồng chỉ chạy là các chuỗi daemon.

synchronized(this) { 
    while (true) { 
     this.wait(); 
    } 
} 

Điều này sẽ làm cho luồng hiện tại chờ trên màn hình của lớp hiện tại cho đến khi ai đó gọi notify() hoặc mãi mãi.

sao chép từ How do you hang a thread in Java in one line?

+0

Bạn có thể trả lời câu hỏi này như thế nào trong 6 giây sau khi câu hỏi được đăng? – Gray

+0

@Gray nó không mất nhiều thời gian để sao chép dán! – meda

+0

đọc dòng cuối cùng và phải mất 6 phút để tìm câu trả lời đúng cho câu hỏi này và cũng đề cập đến rằng từ đó tôi nhận được câu trả lời này – SSP

1

Một chủ đề nói còn sống cho đến khi run() lợi nhuận (hoặc ném ra một lỗi/ngoại lệ) Nếu bạn muốn giữ nó còn sống, sử dụng một vòng lặp, không quay trở lại và bắt bất kỳ lỗi/ngoại lệ.

+0

Xin chào peter, nó là một người nghe nó được thông báo khi ai đó gửi tin nhắn ... vậy làm thế nào để tôi giữ nó chạy? Tôi đã tuyên bố nó như là không daemon thread nhưng chấm dứt với chủ đề chấm dứt người gọi. Làm thế nào để bạn thực hiện những điều như vậy? –

+0

Nó không rõ ràng nếu bạn kiểm soát chủ đề hay không. Cho dù đó là một deamon hay không chỉ là vấn đề trong việc ngăn chặn chương trình thoát ra. Nếu bạn kiểm soát chuỗi, bạn cần thay đổi mã của mình. Nếu chuỗi được tạo bởi một thư viện, bạn cần phải hiểu cách thư viện hoạt động. –

+0

BTW Chủ đề bạn bắt đầu dường như không làm bất cứ điều gì. Bạn có thể loại bỏ nó và nó sẽ làm điều tương tự. Nó không phải là chủ đề mà người nghe sẽ có thể gọi. –

0

Đây là cách tôi giải quyết được vấn đề thời điểm đó, Vì vậy, trường hợp này không phải là đa luồng, có chỉ là một chủ đề duy nhất mà cần thiết để chạy mãi mãi, Vì vậy, chèn

public final void run() { 
while(true) 
{ 
//Run Method Logic... 
} 
} 

Và khởi tạo nó từ một hạt đậu mùa xuân. Tôi cũng đang xem xét những điều ưa thích hơn cho kịch bản luồng đơn này như awaitTermination(); hay đại loại thế.

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