在java中的一个可运行线程中调用不同的方法

时间:2011-07-02 11:21:43

标签: java multithreading

据我所知,到目前为止;实现runnable的类似乎只能在其run方法中执行一个set任务。如何创建一个新线程然后从这个额外的线程运行不同的方法,而不需要为每个设置任务创建一些新的runnable类。

5 个答案:

答案 0 :(得分:3)

  1. 创建自己的Thread(MyThread extends Thread
  2. 子类
  3. 添加私人成员以控制行为。
  4. 添加bean-pattern get / set方法以控制私有成员,或使用流畅的API。
  5. 使用run()方法阅读此属性。
  6.  MyThread t = new MyThread();  
     t.setTypeOfSparrow("African");  
     t.setFavoriteColor("Yellow");  
     t.start();
    

答案 1 :(得分:2)

一个类应该执行一个任务并执行它,如果你在一个Runnable中添加多个操作,那么你违反了这个原则。您应该为每个可运行的任务创建Runnable的新实现。

为了简化您的API,您可能希望创建一个MyRunnableFactory方法,该方法根据一个或多个构造条件构造一个可运行的类。这将使用户不​​必记住为每个任务创建哪个类。

答案 2 :(得分:2)

您的Runnable类可以调用它喜欢的任何逻辑。你想要运行的逻辑必须在某个类中,可以是Runnable类的不同方法,也可以在许多其他类中。

你是如何计划告诉可运行的?

您可以执行以下操作:

 MyRunnable implements Runnable {
     private String m_whatToDo;

     public MyRunnable(String whatToDo) {
           m_whatToDo = whatToDo;
     }


     public void Runnable run() {
          if ("x".equals(m_whatToDo) {
                 // code to do X
          } else if ( "y".equals(m_whatToDo) {
                 // code to do Y
          } else {
                 // some error handling
          }
     }
 }

或者正如Srikanth所说,你可以通过其他方式传达意图,例如线程名称。

但是我没有看到创建runnable类的开销很大。只是将一个公共void run()添加到一个类肯定没什么大不了的?

答案 3 :(得分:0)

你的问题不太清楚。我的猜测是你想在其他一些线程中运行不同的方法,但你不想浪费时间为每个方法重新启动一个新线程。在这种情况下,您需要一个ExecutorService一个线程。您可以将一些Runnables按顺序提交给在调用之间保持活动的线程。

或者更简单地说,如果您已经知道调用方法的顺序

 (new Thread() {
   @Override public void run() {
      method1();
      method2();
      ...
   }
 }).start();

答案 4 :(得分:-1)

在run()方法中检查线程名称并调用适当的方法。

 public class SampleThread  implements Runnable{
/**
 * @param args
 */
Thread t=null;

public SampleThread(String threadName)
{
    t=new Thread(this,threadName);
    t.start();

}
@Override
public void run() {
         if(t.getName().equals("one"))
         {
             One();
         }
         else if(t.getName().equals("two"))
         {
             Two();
         }
}
public void One()
{
    System.out.println(" ---- One ---- ");
}
public void Two()
{
    System.out.println(" ---- Two ---- ");
}

public static void main(String[] args) {
     SampleThread t1=new SampleThread("one");
     SampleThread t2=new SampleThread("two");

}

}