与线程模式混淆

时间:2017-06-02 06:27:12

标签: java android multithreading thread-safety runnable

这看起来可能是一个非常有趣和愚蠢的问题。

我试图在Android应用程序中查看Runnables,Threads,Services和Intent Services的后台操作。

所以我创建了一个活动并在活动中创建了一个简单的线程,比如

public class ExectuableThread implements Runnable{
  @Override
  public void run() {
    Log.e("current-thread", String.valueOf(Looper.getMainLooper().isCurrentThread())); // **Returning true**
    btnDone.setText("will not work");
  }
}

所以在上面的场景中按钮文字正在改变。

无所谓我打电话:

Thread t = new Thread (new ExectuableThread());
t.run();

OR

Thread t = new Thread (new ExectuableThread());
t.start();

为什么我的按钮文本正在改变,如果通过调用start(); - 当使用后台线程时?

现在是一个非常有趣的场景;如果我延迟2秒,就像这样;

public class ExectuableThread implements Runnable{
  @Override
  public void run() {
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    Log.e("current-thread", String.valueOf(Looper.getMainLooper().isCurrentThread()));
    btnDone.setText("will not work");
  }
}

如果我调用start(),则视图不会更新;在run()调用的情况下。它会起作用。

start()和run()之间的区别很明显,但是如果Thread在后台,按钮文本的更新问题也是一样的。

2 个答案:

答案 0 :(得分:2)

首先,您的命名不太好:

public class ExectuableThread implements Runnable {

意味着这个类的实例是线程,但当然不是。因此,您正在将混淆添加到整个问题中。

  

我的问题是为什么我的按钮文字正在改变,如果通过调用start();线程在后台运行。

事情是:当你没有以“正确的方式”做事时,特别是在多线程中,各种各样的事情都会发生。

含义:为了更新Android中的UI元素,您应该使用runOnUiThread。更新其他线程中的UI元素可能有效,也可能无效。

答案 1 :(得分:-1)

主要区别在于,当程序调用start()方法时,会创建一个新的Thread并在新的Thread中执行run()方法,而如果直接调用run()方法,则不会创建新的Thread并且run()中的代码将会在当前线程上执行。

第二个区别是如果你调用start()方法两次,那么它将抛出IllegalStateException