Thread.join()在Android中不起作用?

时间:2012-06-13 09:08:52

标签: java android multithreading

我想创建长时间运行的应用程序,以便在不同的线程上执行各种任务。每项任务都应该有一分钟的超时时间。这是我的实施:

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并通知而不是那个,你认为更好的方法是什么?

2 个答案:

答案 0 :(得分:1)

我更喜欢使用TimerTimerTask执行所有时基任务。检查以下代码,这可能对您有用:

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描述说它对destroystop是不安全的(因此这两种方法都已被弃用),并且停止线程的方法之一是抛出异常。因此,我正在检查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