Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与螺纹模式混淆_Java_Android_Multithreading_Thread Safety_Runnable - Fatal编程技术网

Java 与螺纹模式混淆

Java 与螺纹模式混淆,java,android,multithreading,thread-safety,runnable,Java,Android,Multithreading,Thread Safety,Runnable,这可能看起来是一个非常有趣和愚蠢的问题 我正在尝试查看Android应用程序中的可运行程序、线程、服务和意图服务的后台操作 所以我创建了一个活动,并在活动中创建了一个简单的线程 public class ExectuableThread implements Runnable{ @Override public void run() { Log.e("current-thread", String.valueOf(Looper.getMainLooper().isCurrentT

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

我正在尝试查看Android应用程序中的可运行程序、线程、服务和意图服务的后台操作

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

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();

如果调用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()之间的区别很明显,但问题是相同的,如果线程在后台,为什么按钮文本会更新。

首先,您的命名不太好:

public class ExectuableThread implements Runnable {
这意味着这个类的实例是线程,但它们当然不是。因此,你正在给整个问题增添混乱

我的问题是,如果调用start(),为什么我的按钮文本会发生变化;线程在后台运行

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


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

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


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

我认为这将帮助您理解run()和start()方法之间的区别@santoXme谢谢。我理解这一点,但如果您能纠正我的问题或回答,我会很有帮助。:)很抱歉命名和“可执行文件”拼写错误;现在,我会记住,但我是在虚拟应用程序中测试代码的。阅读作品;我知道runOnUiThread会起作用,但仍然很好奇为什么会发生这种情况。我同意发现这样的事情很有趣,但多线程就是这样:当你做错事时,所有的赌注都没有了。各种事情都可能发生。
public class ExectuableThread implements Runnable {