2013-10-22 7 views
7

私は着信メッセージのリスナーであり、明示的に接続を切断するまで永遠に(受信メッセージをリッスンできるように)クラスする必要があります。スレッドをsetDaemon(false)として宣言しましたが、呼び出しメソッドの終了で終了します。リスナーのスレッドを生かし続ける方法

スレッドを有効にして、Spring TaskExecutorを実装する方法を説明してください。

ありがとうございます。 誰かがメッセージを送信したときに通知を受け取るリスナーです...どうすればそれを実行し続けますか?

リスナクラス

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); 
      } 
     } 
    }); 
    } 
} 

呼び出しクラスは、単純にそのオブジェクトやスレッドがリスナーのコンストラクタによって開始される作成されます。

このスレッドは、中断するまで実行したままにしておきたいです。

使用otherThread.join()

+0

コードを掲載することはできますか? – Rajj

+0

[Javaでスレッドを1行にぶら下げる方法は?](http://stackoverflow.com/questions/3203139/how-do-you-hang-a-thread-in-java-in-one -line) – SSP

+0

スレッドを投稿しました。紳士は、通常、リスナーの実行を保つために何をしていますか教えてください。 –

答えて

2

あなたは永遠に初期スレッドをぶら下げよりも良いだろうことを行うことができますいくつかのことがあります。これにより、実行中の現在のスレッドは、他のスレッドの実行が終了するまでスリープします。 @nandaが示唆するように、ExcecutorService.shutdown()を使用すると、スレッドプールが終了するまで待つことができます。 otherThread.setDaemon(false)を使用して、最初のスレッドを終了させるだけです。これにより、新しいスレッドがユーザースレッドとして設定されます。実行中のスレッドのみがデーモンスレッドになるまで、Javaはシャットダウンしません。

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

誰かがnotify()、または永遠を呼び出すまで、これが現在のクラスのモニターに現在のスレッドの待機を行います。 How do you hang a thread in Java in one line?

+0

質問が投稿された後、この6_seconds_にどのように答えることができましたか? – Gray

+0

@Grayペーストをコピーするのに時間がかかりません! – meda

+0

最後の行を読んで、この質問の正解を見つけるのに6分かかりました。そして、私はこの回答をどこから得たかを言います。 – SSP

1

スレッドからコピー

あなたはループを使用し、生きてそれを維持したい場合は、任意のエラー/例外を返し、キャッチしないrun()リターン(またはエラー/例外をスロー)まで生きて言います。

+0

こんにちはピーター、誰かがメッセージを送信したときに通知を受け取るリスナーです...どうすればそれを実行し続けますか?私はデーモンではないスレッドとして宣言していますが、呼び出し側のスレッド終了で終了します。あなたはそのようなものをどのように実装していますか? –

+0

スレッドを制御するかどうかは不明です。デーモンであるかどうかは、プログラムが終了するのを防ぐ上で重要なことです。スレッドを制御する場合は、コードを変更する必要があります。スレッドがライブラリによって作成されている場合は、ライブラリの仕組みを理解する必要があります。 –

+0

BTW起動したスレッドは何もしないようです。あなたはそれを取り除くことができ、それは同じことをするでしょう。これは、リスナーが呼び出せるスレッドではありません。 –

0

これは私が時間、 だからこの場合は、マルチスレッドではなかった、これまでに立候補するために必要なだけの単一のスレッドを持っていた、 ので

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

を挿入してから、それをインスタンス化する問題を解決する方法であります春の豆。 また、awaitTermination()のようなこの単一スレッドのシナリオでは、もっと派手なことを見ていました。またはそのようなものです。

関連する問題