访问现有线程

时间:2016-09-21 17:21:58

标签: java android multithreading bluetooth

在我的程序中,我有一个BroadcastReceiver,我正在创建一个新的Bluetooth ConnectedThread。

ConnectedThread thread = new ConnectedThread(btSocket);
thread.start();

但是我需要在不同的范围内访问这个线程(接收器以外的方法)。 thread.write(bytesWrite);我不想创建另一个线程,我需要访问现有线程。而且,我不能在接收器之外声明线程,因为我不能放置未知参数(btSocket)。

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是保留对刚刚创建的线程的subprocess.Popen引用。在您收到的时候,请执行:

static

然后,无论您在哪个班级,都可以通过public YourReceiver extends BroadcastReceiver { @Nullable public static ConnectedThread thread; public void onReceive(...) { thread = new ConnectedThread(btSocket); thread.start(); } } 引用该帖子。

这种方法的主要缺点是保留对YourReceiver.thread的静态引用是浪费的(ConnectionThread不会是GC,直到你发布该引用为止)所以make确保您在完成任务时将其取消。 您可能遇到的另一个问题是确保在使用之前检查线程的内部状态,即它是否仍在运行或已经完成执行。

答案 1 :(得分:0)

您至少有3个主题:

  1. ConnectThread
  2. 创建ConnectThread的那个
  3. 不同范围内的主题
  4. 要获取ConnectThread的引用,您需要在线程2(创建ConnectThread的线程)和线程3(不同范围内的线程)中可用的内容。

    一个简单的方法可能是,让ThreadHolder类具有一个保存线程引用的静态变量:

    public class ThreadHolder{
      public static ConnectedThread connectedThread
    }
    

    在主题2中设置引用:

    ConnectedThread thread = new ConnectedThread(btSocket);
    ThreadHolder.connectedThread=thread;
    thread.start();
    

    在第3个主题中你会找到它:

    ConnectedThread thread = ThreadHolder.connectedThread=thread;
    //now do what you need with the thread
    

    或者,您可以在线程2中为ConnectedThread指定名称:

    thread.setName( “connectedThread”)

    使用此方法在htread 3中找到它:

    public Thread getThreadByName(String threadName) {
       for (Thread t : Thread.getAllStackTraces().keySet()) {
        if (t.getName().equals(threadName)) return t;
       }
      return null;
    } 
    

    另见find thread by name