为什么 thread.join 通常用于停止 Android 中的线程



查看几个 android 示例,我看到了使用 join() 方法暂停线程的趋势:

编辑:请假设 2 个线程已正确定义。 编辑了对 join() 的调用

public class MainUI extends Activity{
   private GraphicsViewThread g;
   private BackendDataViewThread b;
   void onCreate(){
      g = new GraphicsViewThread();
      g.start();
      b = new BackendDataViewThread();
      b.start();
   }
   .
   .
   .
   void pauseGame(){
      try {
        g.join();
      }catch (InterruptedException e){
         e.printStackTrace();
      }
      try {
        b.join();
      }catch (InterruptedException e){
         e.printStackTrace();
      }
      GraphicsViewThread = null;
      BackendDataViewThread  = null;
   }
}
  1. GraphicsViewThread 和 BackendDataViewThread 加入哪个线程?
  2. 使用 join() 有什么需要? 我不能立即将引用设置为 null 吗?

我怀疑你的代码无法编译,但无论如何 - 我会回答。
这不仅仅是关于Android,而是关于普通的Java。
使用"join"可确保代码等待线程结束。
这不正是你想要的吗?
此外,不要将线程的引用设置为 null。
您无法保证线程的确切结束时间,因此在线程对象结束之前将线程对象设置为 null 是一种不好的做法。

这是一个会合函数,这意味着您引用的线程(例如 GraphicsViewThread)将在该点加入父/主/UI 线程(首先到达那里)。这是实际绘制 UI 的线程。 不能只将引用设置为 null,因为它只是一个引用。该任务仍将在后台运行。

就我使用Android并对其进行分析而言,我已经学会了避免使用线程。使用,AsyncTask或其他类似的容器。它更易于管理。

编辑:我刚刚注意到,正如其他人提到的,您的代码不正确,它可能不起作用。

您在代码中有几个错误,并且对Thread.join的目的感到困惑。 必须在Thread的实例上调用join方法。因此,您需要在gb上调用加入。 在调用 join 之前,通常必须以某种方式通知这些线程您希望它们停止。 正如 zaske 所提到的,join将等到该线程完成,然后再在调用 pauseGame 的线程中继续执行。

最新更新