Запуск Java-класса в разных потоках - PullRequest
2 голосов
/ 27 мая 2009

Мне интересно, как я могу вызывать класс из разных потоков, и чтобы все вызовы выполнялись в его собственном потоке?

Допустим, у меня есть три потока, и каждый из них должен вызывать anotherClass.getBS (), но вызовы могут поступать одновременно, и нет причин выполнять их по одному. Замки не являются проблемой.

Спасибо!

Ответы [ 2 ]

7 голосов
/ 27 мая 2009

Если anotherClass.getBS () действительно потокобезопасен, вы можете просто вызвать его из каждого из трех потоков. Он будет работать в потоке, из которого вы его вызвали.

Небольшой пример этого в действии. Код ниже производит этот вывод:

$ javac Bar.java
$ java Bar
Thread ID 9 running
Thread ID 10 running
Thread ID 8 running
Doing something on thread 9
Doing something on thread 10
Doing something on thread 8
Thread ID 9 running
Doing something on thread 9
Thread ID 8 running
Doing something on thread 8
Thread ID 10 running
Doing something on thread 10

Вот код:

public class Bar
{

  static private final class MyOtherClass
  {
    public void doSomething()
    {
      System.out.println("Doing something on thread "+Thread.currentThread().getId());
    }
  }

  static private MyOtherClass myOtherClass=new MyOtherClass();

  static private final class MyThreadClass implements Runnable
  {
    public void run()
    {
      while (true)
      {
        try
        {
          Thread.sleep(1000);
        }
        catch (InterruptedException ie)
        {
          System.err.println("Interrupted");
          return;
        }
        System.out.println("Thread ID "+Thread.currentThread().getId()+" running");
        myOtherClass.doSomething();
      }
    }
  }

  static public void main(String[] args)
  {
    Thread t1=new Thread(new MyThreadClass());
    Thread t2=new Thread(new MyThreadClass());
    Thread t3=new Thread(new MyThreadClass());
    t1.start();
    t2.start();
    t3.start();
  }

}
2 голосов
/ 27 мая 2009

Если вы уверены, что у метода getBS() нет проблем с параллелизмом, просто вызовите метод нормально.

Если метод static, просто выполните:

AnotherClass.getBS();

еще

Передать ссылку anotherClass obj каждому потоку:

 class MyThread extends Thread {
     private AnotherClass anotherClass;

     MyThread(AnotherClass anotherClass) {
         this.anotherClass= anotherClass;
     }

     public void run() {
         anotherClass.getBS();
     }
 }


 MyThread p = new MyThread(anotherClass);
 p.start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...