如何在一个线程中运行几个方法?

时间:2015-02-12 11:08:54

标签: java android multithreading

我有一个问题,当我想运行不在主线程中的几个方法时,我做的是我创建了一个从Runnable扩展的类并将我的所有任务放在那里,实际上有很多任务,然后在主线程我创建Thread的新实例并将我的runnable类作为参数传递,但我得到的是run方法是在线程中执行的唯一代码,如果我想调用runnable类中的任何方法,它将在主线程中执行,而不是在新线程中执行。

示例:

public class ConnectionManager implements Runnable
{

   @Override
   public void run() {

          login();

   }

  public void login()
  {
        //Login Logic
  }

  public void sendMessage()
  {
        //Send Message Via TCP Connection
  }

  public void updateInfo()
  {
        //Update Information
  }

  public void logOut()
  {
        //LogOut Logic
  }

}

现在我想在另一个线程中调用这些方法,所以我做了这个

public class Login implements SomeInterface
{

   private Thread thread;
   private ConnectionManager connection;

   public void main(String[] args) {

          connection = new ConnectionManager();
          thread= new Thread(connection);
          thread.start();//this will execute the run method and the login process works fine

   }

  @Override
  public void someCallback()
  {
        connection.sendMessage();//this call is not executed and block the main thread !!
  }

}

我想在另一个线程中运行我的所有方法,但我不想为每个方法创建新线程。

由于

4 个答案:

答案 0 :(得分:0)

嗯,这就是线程在Java中的工作方式。当您调用connection.sendMessage()时,您的方法只会处理ConnectionManager并运行它的代码。您需要在另一个线程run()中执行Your方法,否则它将无法运行。也许你需要一种方法来与你的线程通信,使它在run()中执行一个方法,或者只是探索Future对象给你的可能性?

答案 1 :(得分:0)

这就是Runnable或多线程处理的工作方式。

你永远不应该直接调用run(),只在新函数中执行此函数和其他函数调用。

基本上你的Runnable类应该只包含一个公共函数:run(),你不应该直接调用它...

我建议你把其他函数放在自己的类中。正如您所看到的,工作流不是连续的,在login()之后不会直接调用sendMessage()(否则您可以在run()内部执行它,并且不需要someCallback())。

否则新线程应该在两者之间做什么呢?阻止并等待sendMessage()?那不是一个好的设计。所以你应该为sendMessage()开始一个新线程。

答案 2 :(得分:0)

你应该拆分你的逻辑

public class Logger implements Runnable {
   @Override
   public void run() {
       // login logic here;
   }
}

public class MessegeSender implements Runnable {
  @Override
   public void run() {
        //Send Message Via TCP Connection
  }
}

public class MessegeSender implements Runnable {
  @Override
   public void run() {
        //Update Information
  }
}

public class MessegeSender implements Runnable {
  @Override
   public void run() {
        //LogOut Logic
  }
}

然后在某个客户端:

Runnable logger = new Logger(credentials);
Executors.newSingleThreadExecutor().execute(logger);

答案 3 :(得分:0)

这就是线程在java中的工作方式。一种可能性是在java中使用Actors。您必须在此处下载Akka框架:http://akka.io/downloads/。 演员通过消息工作,他们在一个单独的过程中行动,甚至是驱动消息。换句话说,根据您发送给actor的消息,它将处理相应的方法。

在以下链接中查看实例:http://doc.akka.io/docs/akka/snapshot/java/untyped-actors.html

在java actor中运行等价的方法是onReceive()。 并向演员发送消息,myActor.tell(...)

希望这可以帮助你!!!!