1

Spring 3.2 を使用して Java でチャット プロジェクトを行っています。

通常、Java では次のようなスレッドを作成できます。

public class Listener extends Thread{
    public void run(){
         while(true){

         }
    }
}

でスレッドを開始しますstart()

しかしSpring 3.x、スレッド機能を実現するための特別なクラスや特別な方法はありますか?


私の要件:

2 つのテレコム ドメイン サーバーがあります。私のアプリケーションでは、サーバーを初期化してプロトコルを作成する必要があります。

サーバーが初期化されたら、テレコム ドメイン サーバーからの応答をリッスンするために 2 つのスレッドを開始する必要があります。

私がしたことは以下のとおりです。

public class Listener extends Thread{
    public void run(){

       while(true){
           if(ServerOne.protocol != null){
                Message events = ServerOne.protocol.receive();
                   //Others steps to display the message in the view
           }
       }

    }
}

でJavaスレッド機能を実行することは可能quartzですか?

可能であれば、どちらが良いですか?意味がない場合、その理由は何ですか?

私たちのスタックメンバーがより良い解決策を提供してくれることを願っています.

4

4 に答える 4

1

Spring のThreadPoolTask​​Executor
を使用 できます。設定ファイルでエグゼキュータをそのように定義できます。

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" destroy- method="shutdown">
  <property name="corePoolSize" value="2" />
  <property name="maxPoolSize" value="2" />
  <property name="queueCapacity" value="10" />
</bean>

<task:annotation-driven executor="taskExecutor" />

そのListener中ですべての作業を行うメソッドを作成し、このメソッドに @Async アノテーションを付けることができます。もちろん、ListenerSpring 管理も必要です。

public class Listener{

    @Async
    public void doSomething(){

       while(true){
           if(ServerOne.protocol != null){
                Message events = ServerOne.protocol.receive();
                   //Others steps to display the message in the view
           }
       }

    }
}

が呼び出されるたびに、エグゼキューターによって実行されているスレッドの数doSomethingが少ない場合、新しいスレッドが作成されます。corePoolSizeスレッドの数が作成されるcorePoolSizeと、その後のすべての呼び出しは、実行中の (アイドル状態ではない) スレッドより多いが少ないスレッドがあり、スレッド キューがいっぱいでdoSomethingある場合にのみ、新しいスレッドを作成します。プール サイズの詳細については、Java ドキュメントを参照してください。corePoolSizemaxPoolSize

注 : @Async を使用しているときに、CGLIB ライブラリがアプリケーションで使用可能になっていない場合、次の例外が発生する可能性があります。

Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.

CGLIB の依存関係を追加せずにこれを克服するには、doSomething IListener() を含むインターフェイスを作成してからListener実装することができます。IListener

于 2013-07-02T15:47:39.550 に答える