1

スレッドで2秒ごとにサーバーにリクエストを送信し、何かがあるかどうかを確認しようとしています。値を取得するには、callableを使用する必要があります。2秒ごとに呼び出し可能なスレッドを実行してそこから値を取り戻す方法を理解できません...呼び出し可能な実装のサンプルコードは次のとおりです...

public String call(){
    boolean done = true;
    String returnData = "";
    while(done){
        try {
            returnData = post.getAvailableChat();
            if(!returnData.equals("")){
                System.out.println("Value return by server is "+returnData);
                return returnData;
            }
            return null;
        } catch (IOException ex) {
            done = false;
            Logger.getLogger(GetChatThread.class.getName()).log(Level.SEVERE, null, ex);
        }

これが私のメインクラスのコードです。ここでメインクラスで間違ったことをしたのは、whileループの後でコードが次の行に移動しないためです。しかし、その方法を教えてください。

Callable<String> callable = new CallableImpl(2);                  

    ExecutorService executor = new ScheduledThreadPoolExecutor(1);   
    System.err.println("before future executor");                    
    Future<String> future;                                           

    try {                                                           
        while(chatLoop_veriable){                                    
            future = executor.submit(callable);                         
            String serverReply = future.get();                      
            if( serverReply != null){                               
                System.out.println("value returned by the server is "+serverReply);
                Thread.sleep(2*1000);                               
            }//End of if                                            
        }//End of loop                                              
    } catch (Exception e) {                                         
4

3 に答える 3

3

あなたはScheduledThreadPoolExecutorを正しく選択しましたが、それが提供するメソッドを利用していません。特にあなたの場合は、submitの代わりにscheduleAtFixedRateです。エグゼキュータがスケジューリングを処理するため、スリープ部分を削除できます。

于 2012-10-12T07:17:57.123 に答える
0

APIドキュメントからは、これにもっと似ているはずだと思います(「パブリック」修飾子がないことに注意してください。変数のアクセスレベルを解決するには、おそらくネストされたサブクラスまたは類似のものである必要があります)それは次のようなものでなければなりません... ..

Callable<String> call(){
 // code for the 2000 millisecond thread Callable is some sort of data/process for 
 // a thread to "do"
 return (Callable<String>)callable; // or 1
}

ただし、java.util.concurrent.Executorsは、Callable でこれを実現する方法のようです V is a vector as in the API docs.

于 2012-10-12T07:17:56.467 に答える
0

Future.get()ブロックしているため、スレッドが完了するまで制御は返されません。Future.get(long timeout,TimeUnit unit)を使用する必要があります

future.get(2, TimeUnit.SECONDS);
于 2012-10-12T07:07:45.800 に答える