Java 与螺纹模式混淆
这可能看起来是一个非常有趣和愚蠢的问题 我正在尝试查看Android应用程序中的可运行程序、线程、服务和意图服务的后台操作 所以我创建了一个活动,并在活动中创建了一个简单的线程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
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 {