我有一个问题,当我想运行不在主线程中的几个方法时,我做的是我创建了一个从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 !!
}
}
我想在另一个线程中运行我的所有方法,但我不想为每个方法创建新线程。
由于
答案 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(...)
希望这可以帮助你!!!!