我试图在一个线程中每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) {
答案 0 :(得分:3)
您正确地选择了ScheduledThreadPoolExecutor但您没有利用它提供的方法,特别是在您的情况下:scheduleAtFixedRate而不是提交。然后,您可以删除睡眠部分,因为执行程序将为您处理调度。
答案 1 :(得分:0)
Future.get()
正在阻塞,因此在此之后控件不会返回给您,直到线程完成。你应该使用Future.get(long timeout,TimeUnit unit)
future.get(2, TimeUnit.SECONDS);
答案 2 :(得分:0)
我认为API docs应该更像这样 (注意,没有“public”修饰符,所以它可能需要是一个嵌套的子类或类似的来解决变量的访问级别) 它应该像......
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是API文档中的向量。