我想创建长时间运行的应用程序,以便在不同的线程上执行各种任务。每项任务都应该有一分钟的超时时间。这是我的实施:
runner = new Thread(new Runnable() {
@Override
public void run() { }
// some actions here
});
runner.start();
startJoin = System.currentTimeMillis();
runner.join(TIMEOUT);
stopJoin = System.currentTimeMillis();
if ((stopJoin - startJoin) >= TIMEOUT)
throw new TimeoutException("Timeout when reading the response from process");
一般情况下,它正在工作并抛出TimeoutExceptions,但有时甚至几个小时后它什么也没做。所以问题是Thread.join在Android上是否可靠?
我有一个想法,使用Thread.wait并通知而不是那个,你认为更好的方法是什么?
答案 0 :(得分:1)
我更喜欢使用Timer
和TimerTask
执行所有时基任务。检查以下代码,这可能对您有用:
Timer t =new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
//The task you want to perform after the timeout period
}
}, TIMEOUT);
修改强>
我正试着解决你的问题。我使用@amicngh编写的代码作为我的基本代码并对其进行了一些修改。我假设在TIMEOUT
期后你要关闭正在运行的线程。检查以下代码运行正常以及后面的解释:
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
final long TIMEOUT=100;
final long startJoin = System.currentTimeMillis();
Thread runner = new Thread(new Runnable() {
long stopJoin;
@Override
public void run() {
try{
for(;;){
System.out.println("running ");
stopJoin = System.currentTimeMillis();
if ((stopJoin - startJoin) >= TIMEOUT){
throw new Exception();
}
}
}
catch (Exception e) {
// TODO: handle exception
}
}
// some actions here
});
runner.start();
synchronized (ThreadTest.class) {
ThreadTest.class.wait(TIMEOUT);
}
/*if ((stopJoin - startJoin) >= TIMEOUT)
try {
throw new Exception("Timeout when reading the response from process");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
System.out.println("Running Thread");
}
}
Thread API描述说它对destroy
或stop
是不安全的(因此这两种方法都已被弃用),并且停止线程的方法之一是抛出异常。因此,我正在检查runner
线程内的超时。现在关于使主线程等待它由2行代码完成,它使用synchronized
来同步对线程的访问。
希望这些代码和解释能够解决您的问题。
答案 1 :(得分:0)
参考以下计划。
public static void main(String[] args) throws InterruptedException {
long TIMEOUT=100;
Thread runner = new Thread(new Runnable() {
@Override
public void run() {
for(;;){
System.out.println("running ");
}
}
// some actions here
});
runner.start();
long startJoin = System.currentTimeMillis();
runner.join(TIMEOUT);
long stopJoin = System.currentTimeMillis();
if ((stopJoin - startJoin) >= TIMEOUT)
try {
throw new Exception("Timeout when reading the response from process");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Running Thread");
}
此程序永远不会结束,这意味着您的逻辑不正确。
最好使用TimerTask
。