Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不同的线程中同时使用两种方法_Java_Multithreading - Fatal编程技术网

Java 在不同的线程中同时使用两种方法

Java 在不同的线程中同时使用两种方法,java,multithreading,Java,Multithreading,我正在尝试并行运行两个方法。为此,我编写了如下代码: 在得到批评之后,我想我应该更清楚一些method1()是在本地计算机上运行的本地方法method2()是一种web方法,它将一些数据发送到远程计算机进行处理并返回结果。由于工作时间太长,我将数据分成两部分,一部分在本地处理,另一部分在远程处理 作业完成后,我将结果合并 //str1 and str2 are defined outside the main method. Thread[] threads = new Thread[2];

我正在尝试并行运行两个方法。为此,我编写了如下代码:

在得到批评之后,我想我应该更清楚一些
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()
返回它应该返回的内容。解释可能是
线程[1].start()
没有启动。

您的代码应该适用于您所解释的您想要执行的操作。(编辑前…)

尽管如此,我还是建议使用Java的一种。当涉及到扩展功能或添加更多任务时,它们可能对您非常有用

编辑后:
我怀疑是“赛车状态”。也就是说:在线程完成并设置变量之前检查结果。

您应该问自己一个问题,为什么要并行运行两个方法

使用线程时,请始终考虑任务(要完成的工作)和任务的执行者(在本例中是线程)

因此,如果我们说方法中的东西是一项任务,我们需要执行,那么下一个问题是谁将完成这项任务

现在在您的例子中,您有两个方法要运行,这意味着手头有两个任务。 下一个问题是,这些任务是相互排斥的吗?如果是,则您采用的上述方法是正确的

如果任务不是相互排斥的,并且依赖于一个公共状态。如下图所示:-

//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和method2,如下所示:-

 synchronized method1(){x++;y--;}
 synchronized method2(){x--;y++;}

其余部分保持不变。为了便于参考,您可以查看各种线程同步方法,以获得更有效的方法

假设您已经测试过,您的结果是什么?是的,这是一种方法。您问了一个答案。@zkanoca您可能想回顾一下这个问题。我无法理解,代码的行为与您期望的不一样。在检查线程结果之前,在哪里等待线程完成?