调用runnable线程执行的runnable外部的runnable实例的方法

时间:2011-11-04 16:33:16

标签: java multithreading methods

问题很混乱,但这就是我想要做的事情:

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 个答案:

答案 0 :(得分:4)

Runnable的想法是它是一个合并的代码段,可以由它选择的任何上下文中的其他内容执行(在本例中为一个线程)。第二个帖子在启动时会调用run()方法,因此您可能希望在foo()方法中调用MyClass.run()。您无法从主线程中任意决定第二个线程现在将放弃run()方法中的任何操作并开始处理foo()

答案 1 :(得分:3)

您无法调用线程,您只能发出信号。如果你想要执行foo(),你必须发出run()信号,要求它执行foo()。

答案 2 :(得分:1)

更改您的代码如下:

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");
    }
}

答案 3 :(得分:1)

我修改你的类以包含一个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");
          }
       });
   }
}