2

查看几个 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() 需要什么?我不能立即将引用设置为空吗?
4

3 回答 3

5

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

于 2012-10-06T16:41:44.107 回答
0

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

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

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

于 2012-10-06T16:42:08.337 回答
0

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

于 2012-10-06T16:43:47.677 回答