Вызовите метод запускаемого экземпляра вне исполняемого объекта, который выполняется потоком исполняемого объекта - PullRequest
4 голосов
/ 04 ноября 2011

Вопрос сбивает с толку, но вот что я хочу сделать:

public class Main
{
    MyClass instance = new MyClass();
    Thread secondThread = new Thread(instance);

    public static void main()
    {
         secondThread.start();
         //here i want to call foo(), but be processed by secondThread thread(not the Main thread)
    }
}


public class MyClass implements Runnable
{
    @Override
    public void run()
    {

    }

    public void foo()
    {
        System.out.println("foo");
    }
}

Если я использую "instance.foo ();"это будет обработано Главным потоком.

Ответы [ 4 ]

4 голосов
/ 04 ноября 2011

Идея Runnable состоит в том, что это консолидированный кусок кода, который может быть выполнен чем-то другим внутри любого контекста, который он выбирает (в данном случае, потока). Второй поток вызовет метод run() при запуске, поэтому вы можете захотеть вызвать foo() в вашем методе MyClass.run(). Вы не можете произвольно решить из основного потока, что второй поток теперь собирается отказаться от всего, что он делал в методе run(), и начать работать с foo().

3 голосов
/ 04 ноября 2011

Вы не можете вызвать поток, вы можете только сигнализировать об этом.Если вы хотите, чтобы foo () выполнялась, вы должны дать команду run () попросить его выполнить foo ().

1 голос
/ 05 ноября 2011

Я бы изменил ваш класс так, чтобы он содержал Executor, и затем его методы попросили бы исполнителя выполнить задачу. Передавая исполнителя в конструктор MyClass, main контролирует выполнение задач.

public class Main
{
   Executor runner = Executors.newSingleThreadExecutor();
   MyClass instance = new MyClass(runner);

   public static void main()
   {
        instance.foo();
        // cleanup executor
   }
}


public class MyClass
{
   private final Executor runner;

   public MyClass(Executor runner)
   {
      this.runner = runner;
   }

   public void foo()
   {
       runner.execute(new Runnable() {
          public void run() {
             System.out.println("foo");
          }
       });
   }
}
1 голос
/ 04 ноября 2011

измените свой код, как показано ниже:

public class Main
{
    Object signal = new Object();
    MyClass instance = new MyClass();
    Thread secondThread = new Thread(instance);

    public static void main()
    {
         instance.setSignal(signal);
         secondThread.start();
          synchronize(signal)
          { 
         try{
          signal.notify();**//here will notify the secondThread to invoke the foo()**
         }
         catch(InterrupedException e)
         {
                e.printStackTrace();
          }
    }
}


public class MyClass implements Runnable
{
    Object signal;
    public setSignal(Object sig)
    {
        signal = sig;
    }

    @Override
    public void run()
    {
       synchronize(signal)
       { 
         try{
          signal.wait();
         }
         catch(InterrupedException e)
         {
                e.printStackTrace();
          }
       }
        this.foo();

    }

    public void foo()
    {
        System.out.println("foo");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...