【发布时间】:2013-04-29 02:13:38
【问题描述】:
线程和定时器有问题。我需要这个方法来执行一些代码,但如果代码需要很长时间,该方法应该返回 false。这是我正在做的事情:
public boolean handShake() {
java.util.Timer t = new java.util.Timer();
t.schedule(new java.util.TimerTask() {
public void run() {
if (threadSuccess = false) {
System.out.println("will kill");
//not sure but this is how I read you should kill threads?
Thread t = handShakeThread;
handShakeThread = null;
t.interrupt();
System.out.println("Should have killed thread");
}
}
}, 8000);
try {
System.out.println("Going to start threads");
handShakeThread = new Thread(new HandShakeThread());
//handShakeThread is a field (Threat) and HandShakeThread is a class extending Runnable
handShakeThread.start();
System.out.println("Thread started");
handShakeThread.join();
System.out.println("finished");
return threadSuccess;
} catch (InterruptedException e1) {
e1.printStackTrace();
return false;
}
}
计时器任务似乎从未被调用。它坐在那里等待和等待。我能做什么?
额外信息: handShakeThread 正在从网络中读取数据。如果成功完成读取,则将字段 threadSuccess 设置为 true。这个想法是,如果从网络读取需要很长时间,则应该有一个超时。这是最好的方法吗?
【问题讨论】:
-
我建议使用 Java 5+ 并发 API。例如,您可以使用 ExecutorService (docs.oracle.com/javase/6/docs/api/java/util/concurrent/…),它为您提供了一些方法来指定超时。
-
可能不相关,但是您编写
if(threadSuccess = false)将threadSuccess设置为 false 并且不进入 if 块。你可能想要if(!threadSuccess)。 -
你应该能够为你的网络调用设置一个超时时间——比如在套接字上的
setSoTimeout(<time>)或类似的。
标签: java multithreading timer runnable