目前正在尝试执行以下任务: 将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();
}
}
答案 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();
}