我试图并行运行两个方法。为此,我编写了如下代码:
在得到批评后,我认为我应该更清楚。 method1()
是在我的本地计算机上运行的本地方法。 method2()
是一种Web方法,它将一些数据发送到远程计算机以处理和返回结果。由于工作时间太长,我将数据分成两部分,一部分在本地处理,另一部分在远程处理。
工作完成后,我将结果合并。
//str1 and str2 are defined outside the main method.
Thread[] threads = new Thread[2];
threads[0] = new Thread() {
@Override
public void run() { str1 = method1(); }
};
threads[1] = new Thread() {
@Override
public void run() { str2 = method2(); }
};
threads[0].start();
threads[1].start();
当我尝试这种方式时,我从method2()
获得null。如果我运行method2()
外部线程定义str2是null
。
Thread thread = new Thread() {
@Override
public void run() { str1 = method1(); }
};
thread.start();
str2 = method2();
method2()
返回它应该返回的内容。解释可能是thread[1].start()
无法启动。
答案 0 :(得分:0)
您的代码应该适用于您解释的内容。 (在编辑之前......)
然而,让我建议使用Java的Executors之一。在扩展功能或添加更多任务时,它们可能对您有很大用处......
编辑后: 我怀疑是“比赛条件”。即:在线程完成之前检查结果并设置变量。
答案 1 :(得分:0)
你应该问自己这个问题,你为什么要并行运行两种方法?
当使用线程时,总是考虑任务(要完成的工作)和任务的执行者(在这种情况下是一个线程)。
因此,如果我们说方法中的内容是我们需要执行的任务,那么接下来的问题是谁将完成该任务。
现在,在您的情况下,您有两种方法可以运行,这意味着手头有两个任务。 接下来的问题是这些任务是否相互排斥?如果是,则上面采用的方法是正确的。
如果任务不相互排斥并且取决于共同状态。如下所示: -
//x and y are state variables which are shared across two tasks(method1 and method2)
int x; int y;
method1(){x++;y--;}
method2(){x--;y++;}
Thread[] threads = new Thread[2];
threads[0] = new Thread() {
@Override
public void run() { method1(); }
};
threads[1] = new Thread() {
@Override
public void run() { method2(); }
};
threads[0].start();
threads[1].start();
现在,我们必须确保两个线程可以顺序访问状态变量x和y。因此,我们通过使用线程同步技术同步对这些状态变量的访问来实现这一点。
有各种方法,最简单的方法是将synchronized关键字添加到method1和方法2,如下所示: -
synchronized method1(){x++;y--;}
synchronized method2(){x--;y++;}
休息保持不变。作为参考,您可以看到各种线程同步方法,以实现更高效的方法。