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

Java 使用线程以不同的间隔输出消息

Java 使用线程以不同的间隔输出消息,java,multithreading,java-8,Java,Multithreading,Java 8,当前正在尝试执行以下任务: 以不同的间隔将10条消息输出到控制台,而之前的消息不会停止工作 因此,就我的产出而言,我正在寻找与 信息0 信息1 信息0 信息2 信息0 信息1 信息3 我需要使用线程来完成这个任务,但我真的不知道我在做什么。 下面的代码看起来像是可以做到这一点的,但它的输出只是一团乱,无法产生预期的结果 public class Task { public static void main(String[] args) throws InterruptedExceptio

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

因此,就我的产出而言,我正在寻找与

信息0

信息1

信息0

信息2

信息0

信息1

信息3

我需要使用线程来完成这个任务,但我真的不知道我在做什么。 下面的代码看起来像是可以做到这一点的,但它的输出只是一团乱,无法产生预期的结果

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();
        }
    }
公共类任务{
公共静态void main(字符串[]args)引发InterruptedException{
整数[]intarr=IntStream.range(3,13).map((i)->i*1000.boxed().toArray(整数[]::new);
字符串[]字符串={
“msg0”、“msg1”、“msg2”、“msg3”、“msg4”,
“msg5”、“msg6”、“msg7”、“msg8”、“msg9”
};
任务测试=新任务(字符串,intarr);
}
垃圾邮件(字符串[]msgs,整数[]毫秒)引发中断异常{
Map msgsmap=IntStream.range(0,msgs.length)。
boxed().collect(Collectors.toMap(i->msgs[i],i->millis[i]);
用于(字符串消息:msgs){
线程t=新线程(()->{
while(true){
System.out.println(msg);
试一试{
sleep(msgsmap.get(msg));
}捕捉(中断异常e){
e、 printStackTrace();
}
}
});
t、 start();
}
}

假设您不需要自己创建线程,我将利用
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个线程始终协作并不是最简单的任务。但是,您可以随意更改延迟,以满足您的需要


如果您需要自己创建线程,我将更改我的答案。

以一种比我最初认为需要的更简单的方法实现了我想要的。代码如下:

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();
    }
公共类任务{
公共静态void main(字符串[]args)引发InterruptedException{
整数[]intarr=IntStream.range(1,11).map((i)->2+i*1000).boxed().toArray(整数[]:::新);
字符串[]字符串={
“msg0”、“msg1”、“msg2”、“msg3”、“msg4”,
“msg5”、“msg6”、“msg7”、“msg8”、“msg9”
};
任务测试=新任务(字符串,intarr);
}
任务(字符串[]消息,整数[]间隔){
for(int i=0;i{
while(true){
试一试{
睡眠(间隔);
}捕捉(中断异常e){
e、 printStackTrace();
}
System.out.println(消息);
}
});
t、 start();
}

IMHO
ScheduledThreadPool
使用基于堆的数据结构来处理延迟的任务,因此工作线程的数量与实际调度的任务数量没有多大关系。如果您能解释如何创建它们,我将不胜感激,因为我想从头开始理解线程。