一直以来,我相信一旦一个线程完成执行,即它的 run 方法完成,它就不能再次启动。
我正在关注 this 教程,他创建了一个新的 Thread 类来演示线程的概念。他运行一个 for 循环,在线程中睡了一秒钟,并在循环的每次迭代中发布一条日志消息。他在单击按钮时启动了线程,一旦线程完成,他尝试再次启动线程,但它崩溃了,这似乎验证了一旦线程死了,它们就无法重新启动
但我的 Android 设备并非如此。我使用 AIDE(Google 商店中的付费 IDE)进行编程(如果这很重要),并编写了与上述相同的代码。令我惊讶的是,即使完成,该线程也会在单击按钮时一遍又一遍地开始。
我在模拟器上运行相同的应用程序,但在尝试启动死线程时它崩溃了,那么我哪里出错了??我没有其他物理设备来测试这一点。我只是糊涂了!
编辑 代码:
//The thread class
public class ExampleLooperThread extends Thread
{
private static String TAG = "ExampleLooperThread";
@Override
public void run()
{
for(int i = 0; i<5; i++){
Log.d(TAG,"run: "+i);
SystemClock.sleep(1000);
}
Log.d(TAG,"End of run()");
}
}
下面是我的活动代码
public class MainActivity extends Activity {
ExampleLooperThread looperThread = new ExampleLooperThread();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void startThread(View view){
looperThread.start();
}
}
编辑:我只能在我的物理设备上重新创建它。多次按下 startThread 按钮,我的 logcat 看起来像
2021-02-12 17:41:01.481 26705-28063/com.codewithmab.myapplication D/ExampleLooperThread: Run 0
2021-02-12 17:41:02.255 26705-28064/com.codewithmab.myapplication D/ExampleLooperThread: Run 0
2021-02-12 17:41:02.482 26705-28063/com.codewithmab.myapplication D/ExampleLooperThread: Run 1
2021-02-12 17:41:03.255 26705-28064/com.codewithmab.myapplication D/ExampleLooperThread: Run 1
2021-02-12 17:41:03.482 26705-28063/com.codewithmab.myapplication D/ExampleLooperThread: Run 2
2021-02-12 17:41:04.256 26705-28064/com.codewithmab.myapplication D/ExampleLooperThread: Run 2
2021-02-12 17:41:04.483 26705-28063/com.codewithmab.myapplication D/ExampleLooperThread: Run 3
2021-02-12 17:41:05.256 26705-28064/com.codewithmab.myapplication D/ExampleLooperThread: Run 3
2021-02-12 17:41:05.483 26705-28063/com.codewithmab.myapplication D/ExampleLooperThread: Run 4
2021-02-12 17:41:06.257 26705-28064/com.codewithmab.myapplication D/ExampleLooperThread: Run 4
2021-02-12 17:41:06.483 26705-28063/com.codewithmab.myapplication D/ExampleLooperThread: End of run
2021-02-12 17:41:07.257 26705-28064/com.codewithmab.myapplication D/ExampleLooperThread: End of run
我的设备是否创建了不同的线程?为什么会出现这种奇怪的结果?
好的我修改了run()末尾的Log来查看每个线程的Id
Log.d(TAG ,"End of run <- "+getId());
另一个震惊,因为它再次重新启动相同的 ID