Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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_Concurrency_Threadpool - Fatal编程技术网

Java 如何使多个线程并行运行,以使线程一个接一个地执行

Java 如何使多个线程并行运行,以使线程一个接一个地执行,java,multithreading,concurrency,threadpool,Java,Multithreading,Concurrency,Threadpool,我正在尝试实现视差线程执行。比如说 t1、t2和t3是三个线程,每个线程执行一个打印任务 乘法表。我想按顺序执行它们 执行顺序:t1-->t2-->t3-->t1 到目前为止,我能够创建三个独立执行任务的线程 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SynchronizationExample1 { public static voi

我正在尝试实现视差线程执行。比如说

t1、t2和t3是三个线程,每个线程执行一个打印任务 乘法表。我想按顺序执行它们

执行顺序:t1-->t2-->t3-->t1

到目前为止,我能够创建三个独立执行任务的线程

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SynchronizationExample1 {
    public static void main(String[] args) {
        ExecutorService es = Executors.newFixedThreadPool(3);   
        for(int i=1; i<=10; i++){
            es.execute(new Task(i));
        }
        es.shutdown();

        while(!es.isTerminated()){

        }
        System.out.println("finished all task");
    }
}
输出:

pool-1-thread-1Start counter = 1
pool-1-thread-3Start counter = 3
pool-1-thread-2Start counter = 2
pool-1-thread-1End counter
pool-1-thread-1Start counter = 4
pool-1-thread-3End counter
pool-1-thread-3Start counter = 5
pool-1-thread-2End counter
pool-1-thread-2Start counter = 6
pool-1-thread-1End counter
pool-1-thread-1Start counter = 7
pool-1-thread-3End counter
pool-1-thread-3Start counter = 8
pool-1-thread-2End counter
pool-1-thread-2Start counter = 9
pool-1-thread-1End counter
pool-1-thread-1Start counter = 10
pool-1-thread-3End counter
pool-1-thread-2End counter
pool-1-thread-1End counter
finished all task
我正在尝试实现视差线程执行。例如,t1、t2和t3是三个线程,每个线程执行打印乘法表的任务我想按顺序执行它们。

这在术语上是矛盾的

你可以并行或按顺序做事,但不能同时做这两件事。(就像跑步和骑自行车同时进行!)


正如@Thilo所说,简单、实用(也是最好的)解决方案不是使用多个线程。只需使用一个线程和一个
循环即可

如果您打算使用多个线程执行此操作,则需要线程进行同步。(这就是您当前代码的问题所在。您没有同步…只有三个“自由运行”线程和
sleep()
调用。这种方法永远不会可靠。)

比如说,

  • 线程1打印一行,告诉线程2“轮到你了”,然后等待轮到它
  • 线程2打印一行,告诉线程3“轮到你了”,然后等待轮到它
  • 线程3打印一行,告诉线程1“轮到你了”,然后等待轮到它
  • 等等
直到你走到尽头。(那时你需要做一些特别的事情……)

对于每三对线程,该通知可以采用3个单独的“通道”(基本互斥体、锁存器、信号量、队列等)的形式,或者采用单个“通道”的形式,其中每个线程等待轮到它


(还有其他方法可以解决这个问题……但我们不需要在这里深入讨论。)

那么为什么不使用一个线程呢?如果您想让不同的线程依次工作,请解释您希望以不同线程打印的原因。'Parallel。。。“一个接一个”在术语上是矛盾的。如果您想要顺序执行,请不要使用线程。@谢谢EJP的回复。这里我所说的并行是指,以这样一种方式分别运行所有3个线程,即线程“t1”开始其第一次迭代并等待t2完成其第一次迭代,在第三个线程“t2”完成其第一次迭代后,线程“t3”开始其第一次迭代。t3完成第一次迭代后,线程t1应恢复第二次迭代。等等
public class Task implements Runnable {
    private int i; 
    public Task(int i){
        this.i = i;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+ "Start counter = " + i);
        processMessage();
        System.out.println(Thread.currentThread().getName()+ "End counter");
    }

    public void processMessage(){
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
pool-1-thread-1Start counter = 1
pool-1-thread-3Start counter = 3
pool-1-thread-2Start counter = 2
pool-1-thread-1End counter
pool-1-thread-1Start counter = 4
pool-1-thread-3End counter
pool-1-thread-3Start counter = 5
pool-1-thread-2End counter
pool-1-thread-2Start counter = 6
pool-1-thread-1End counter
pool-1-thread-1Start counter = 7
pool-1-thread-3End counter
pool-1-thread-3Start counter = 8
pool-1-thread-2End counter
pool-1-thread-2Start counter = 9
pool-1-thread-1End counter
pool-1-thread-1Start counter = 10
pool-1-thread-3End counter
pool-1-thread-2End counter
pool-1-thread-1End counter
finished all task