Когда и кто выполняет вызов метода? - PullRequest
0 голосов
/ 16 октября 2019

Я использую простой вызов метода для выполнения методов в других классах.

Когда я использую это в сочетании с двумя потоками и BlockingQueue, я спрашивал себя, какой поток и когда выполняются эти вызовы.

Я сделал пример псевдокода, который не очень полезен, но описывает случай:

Поток A

public class ThreadA extends Thread {
  private static final String TAG = "ThreadA";

  @Override
  public void run() {

    ThreadB threadB = new ThreadB();
    threadB.start();
    InputStream InPut = null;//Imagen this inputStream results out of any kind 
                             //of connection (Bluetooth,...)
    byte[] buffer = new byte[1024];

    while (true){
      try {
        InPut.read(buffer);
        threadB.send(buffer+"");
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

Поток B

public class ThreadB extends Thread {
  private static final String TAG = "ThreadB";

  private BlockingQueue<String> queue = new LinkedBlockingQueue<>();

  @Override
  public void run() {
    while (true){
      String st ="";
      try {
        st = queue.take();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }

      Log.d(TAG, "String is: " + st);
    }
  }


  public void send(String a) {
    queue.add(a);
  }
}

Сценарий:Когда поток B заблокирован в .take(), но метод вызывается, как это работает?

Мой вопрос вытекает из наблюдения, что входной поток в потоке A считывает неверные данные, когда я его использую.

1 Ответ

0 голосов
/ 16 октября 2019
threadB.send(buffer+"");

Я предполагаю, что ваше замешательство связано с этим звонком. Это метод, вызываемый threadA.

Чтобы понять это в общем, вам необходимо различать нить Java-объектов нитей и фактические потоки ОС. Java Thread Objects не являются «реальными» потоками, они просто представляют поток.

Если start () вызывается для объекта потока, он создает новый «реальный» поток ОС, который выполняетметод run (). Другие методы, которые вы вызываете для такого объекта потока, такие как join (), являются методами, которые вы вызываете в текущем потоке, но которые вызывают системные вызовы ОС, которые взаимодействуют с «реальными» потоками. То, что внутри подкласса Thread есть метод, который вы вызываете, не имеет никакого отношения к тому, какой поток его выполняет, это всегда текущий поток.

...