Java 使用线程以不同的间隔输出消息
当前正在尝试执行以下任务: 以不同的间隔将10条消息输出到控制台,而之前的消息不会停止工作 因此,就我的产出而言,我正在寻找与 信息0 信息1 信息0 信息2 信息0 信息1 信息3 我需要使用线程来完成这个任务,但我真的不知道我在做什么。 下面的代码看起来像是可以做到这一点的,但它的输出只是一团乱,无法产生预期的结果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
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();
}
IMHOScheduledThreadPool
使用基于堆的数据结构来处理延迟的任务,因此工作线程的数量与实际调度的任务数量没有多大关系。如果您能解释如何创建它们,我将不胜感激,因为我想从头开始理解线程。