使用线程输出具有不同间隔的消息

时间:2018-04-17 22:50:01

标签: java multithreading java-8

目前正在尝试执行以下任务: 将10条消息以不同的间隔输出到控制台,而不使之前的消息停止工作。

因此,就我的输出而言,我正在寻找符合

的内容

消息M 0

MESSAGE1

消息M 0

消息2

消息M 0

MESSAGE1

MESSAGE3

需要使用线程来完成这项任务,老实说,我真的不知道自己在做什么。 以下代码看起来像是可以做到的,但它的输出只是一团糟而无法产生所需的结果。

public class Task {
    public static void main(String[] args) throws InterruptedException {
        Integer[] intarr = IntStream.range(3, 13).map((i)->i*1000).boxed().toArray(Integer[]::new);
        String[] strings = {
                "msg0", "msg1", "msg2", "msg3", "msg4", 
                "msg5", "msg6", "msg7", "msg8", "msg9"

        };
        Task test = new Task(strings, intarr);

    }
    Spam(String[] msgs, Integer[]millis) throws InterruptedException {
        Map<String, Integer> msgsmap = IntStream.range(0, msgs.length).
                boxed().collect(Collectors.toMap(i-> msgs[i],i->millis[i]));
        for(String msg:msgs){
            Thread t = new Thread(()-> {
                while(true) {
                    System.out.println(msg);
                    try {
                        Thread.sleep(msgsmap.get(msg));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }
    }

2 个答案:

答案 0 :(得分:2)

假设您不需要自己创建线程,我会利用ScheduledExecutorService

String[] strings = {
    "msg0", "msg1", "msg2", "msg3", "msg4",
    "msg5", "msg6", "msg7", "msg8", "msg9"
};

ScheduledExecutorService service = Executors.newScheduledThreadPool(strings.length);

IntStream.range(0, strings.length).forEach(i -> service.scheduleAtFixedRate(() -> {
    System.out.println(strings[i]);
}, i + 3, i + 1, TimeUnit.SECONDS));

我能够实现你想要的输出一次,但是让10个线程始终合作并不是最简单的任务。但是,您可以随意将延迟更改为您想要的任何内容。

如果你需要自己创建线程,我会改变我的答案。

答案 1 :(得分:0)

管理以比我原先认为需要的更简单的方法完成我想要的。代码如下:

public class Task {
    public static void main(String[] args) throws InterruptedException {
        Integer[] intarr = IntStream.range(1, 11).map((i) -> 2+i * 1000).boxed().toArray(Integer[]::new);
        String[] strings = {
                "msg0", "msg1", "msg2", "msg3", "msg4", 
                "msg5", "msg6", "msg7", "msg8", "msg9"

        };
        Task test = new Task(strings, intarr);

    }

    Task(String[] messages, Integer[] intervals) {
        for (int i = 0; i < messages.length; i++) {
            runThread(messages[i], intervals[i]);
        }
    }

    private static void runThread(String message, Integer interval) {
        Thread t = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(interval);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(message);
            }
        });
        t.start();
    }