我试图从线程1调用线程2(在循环中调用五次),但线程2仅在线程1中的循环完成后才开始执行

时间:2014-11-24 11:05:08

标签: java android multithreading

我在android活动中定义了2个线程。两个线程都创建为可运行的实例。线程1是一个名为“timer1”的可运行对象(使用匿名内部类创建),线程2(分配给可运行对象“timer2”)使用线程2的处理程序(使用post()方法)从线程1调用。

线程2的处理程序称为“tempHandler”(它是一个实例变量),并在“MyRunnable”类的构造函数中初始化。

Thread1在for循环中对Thread2进行5次调用。预期的结果是Thread2应该在每次调用post()时运行。但它不会发生。相反,Thread1中的整个循环完成,然后才运行Thread2。为什么会这样?以及如何纠正它?

这是第一个主题:

timer1 = new Runnable() {
        @Override
        public void run() {
            timer2 = new MyRunnable();

            for(int i = 0; i < 5; i++){
                tempHandler.post(timer2);
                try{
                    Thread.sleep(1000);
                } catch(Exception e) {
                    System.out.println(e.getMessage());
                }
            }

        }
    };

这是第二个主题:

public class MyRunnable implements Runnable {

    public MyRunnable() {
        tempHandler = new Handler();
    }

    @Override
    public void run() {
        if(Looper.myLooper() == null) {
            Looper.prepare();
        }
        long startTime = System.currentTimeMillis();
        long stopTime = System.currentTimeMillis();
        long elapsedTime = stopTime - startTime;

        System.out.println("Array traversal time: " + String.valueOf(elapsedTime));
        System.out.println("Exited thread 2");

        Looper.loop();
    }
}

1 个答案:

答案 0 :(得分:0)

你没有显示启动线程的代码,但听起来好像你假设RunnableThread s。他们不是。

Runnable就是这样:通过调用run()方法可以运行的东西。但它运行在你调用它的同一个线程中。

一个例子,看看我在说什么:

public static void main(String[] args) {
    final Thread mainThread = Thread.currentThread();
    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println(mainThread);
            System.out.println(Thread.currentThread());
            System.out.println(mainThread == Thread.currentThread());
        }
    };
    r.run();
}

输出类似于:

Thread[main,5,main]
Thread[main,5,main]
true

您创建了一个单独的线程,通过调用new Thread(r)来运行Runnable。用以下代码替换上例中的行r.run();

    Thread newThread = new Thread(r);
    newThread.start();

输出变为:

Thread[main,5,]
Thread[Thread-0,5,main]
false

成功 - 我们有两个不同的主题!

注意:确保您在Thread个对象上拨打start(),而不是run()。这是您的代码无法正常工作的另一个可能原因。虽然Thread对象具有公共run()方法,但这是Java中的历史错误; you should never call it,因为它只是在当前线程上运行代码而不启动新代码。