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

时间:2016-04-03 05:00:20

标签: java multithreading concurrency threadpool

我正在尝试实现parallal线程执行。例如

  

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

--------------------------------
|   t1    |    t2    |    t3   | 
--------------------------------
|   2     |     3    |     4   |
|   4     |     6    |     8   |
|   6     |     9    |    12   |
|   ..    |    ..    |   ..    |
|------------------------------|

执行顺序: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");
    }
}

任务类

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

1 个答案:

答案 0 :(得分:1)

  

我正在尝试实现parallal线程执行。例如,t1,t2和t3是三个线程,每个线程执行打印乘法表的任务。 我想按顺序执行它们。

这是一个矛盾。

您可以并行或按顺序执行操作,但不能同时执行这两项操作。 (这就像是在跑步和骑自行车的同时!)

正如@Thilo所说,简单,实用(和最好)的解决方案不是用多线程来做到这一点。只需使用一个线程和一个for循环。

如果您打算使用多个线程执行此操作,则需要线程进行同步。 (这似乎是你当前代码的问题。你没有同步......只有三个&#34;自由运行&#34;线程和sleep()调用。这种方法永远不可靠。 )

例如,

  • 线程1打印一条线,告诉线程2 - &#34;转弯&#34;,等待轮到
  • 线程2打印一条线,告诉线程3 - &#34;转弯&#34;,等待轮到
  • 线程3打印一条线,告诉线程1 - &#34;转弯&#34;,等待轮到
直到你走到尽头。 (你需要做一些特别的事情......)

此通知可以采用3个独立的&#34;频道&#34; (原始互斥锁,锁存器,信号量,队列,等等)每三对线程,或一个&#34;通道&#34;每个线程等待轮到的地方。

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