1

我试图在一个线程中每 2 秒向服务器发送一次请求,并检查是否有东西给我。我无法弄清楚如何每 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,但您没有利用它提供的方法,特别是在您的情况下:scheduleAtFixedRate而不是提交。然后,您可以删除睡眠部分,因为执行程序将为您处理调度。

于 2012-10-12T07:17:57.123 回答
0

Future.get()是阻塞的,所以在线程完成之前控制权不会返回给你。你应该使用Future.get(long timeout,TimeUnit unit)

future.get(2, TimeUnit.SECONDS);
于 2012-10-12T07:07:45.800 回答
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 note V 实现的,它是 API 文档中的向量。

于 2012-10-12T07:17:56.467 回答