三个线程,三个句子,正确的顺序

时间:2018-05-22 17:49:03

标签: java multithreading

我们如何使用不同的线程来编写将以所描述的顺序显示以下3个句子的Java代码来打印每个句子?

有人可以用一个例子来解释吗?

Hello there. 
How are you? 
Thank you, very much!

2 个答案:

答案 0 :(得分:1)

有多种解决方案。在我看来,最冗长但最容易理解和基本概念之一就是启动三个单独的线程并等待它们以thread.join结束。或者,您可以使用使用更高级别API的解决方案,例如倒计时锁定或锁定。

这看起来像是:

final Thread first = new Thread(() -> System.out.println("Hello there."));
        final Thread second = new Thread(() -> System.out.println("How are you?"));
        final Thread third = new Thread(() -> System.out.println("Thank you, very much!"));
        first.start();
        first.join();
        second.start();
        second.join();
        third.start();
        third.join();

输出:

  

你好。

     

你好吗?

     

非常感谢你!

在我看来,这是非常冗长和最基本的低级别。有更清晰的例子可以使用不同的范例,比如有消息传递的actor。或者使用倒计时锁存器等待其他线程完成。您可以使用等待和通知,或者可能有一些其他优雅的解决方案。除了这个样本,你想要达到什么目的?

答案 1 :(得分:0)

稍微复杂的方式:

public class Sentences {

    private static final String[] sentences = {
            "Hello there.",
            "How are you?",
            "Thank you, very much!"
    };
    private static int currentIndex = 0;

    public static void main(String... args) {
        for (int i = 0; i < 3; i++) {
            new Thread(Sentences::say).start();
        }
    }

    private static synchronized void say() {
        System.out.println(Thread.currentThread().getName() + " says: " + sentences[currentIndex++]);
    }

}

通过删除synchronized关键字,您可能会一次又一次地执行main方法,从而看出问题是怎么回事。有时输出是正确的。有时订单是错误的。有时一条线丢失,另一条线打印两次。欢迎来到Pandora的盒子; - )