[英]Java: If a java library is not thread safe, does this mean I can't run it in a separate thread?
[英]java simple thread, but it can't run
这是一个简单的java线程。
有 2 个线程,应该每 5 秒打印一次。
没有错误。
但我就是跑不动。
请帮我找出问题所在...
class MyThread extends Thread {
String message;
int delay;
public MyThread(String s, int d) {
message = s;
delay = d;
}
public void run() {
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
System.out.println(message + "+" + delay );
}
}
}
public class applet {
public static void main(String[] args){
MyThread mt1, mt2;
mt1 = new MyThread("Hello", 5000);
mt2 = new MyThread("Bye ", 10000);
mt1.start();
mt2.start();
}
}
如果发生异常,您只打印一次...
修改run
方法为:
public void run() {
try {
Thread.sleep(delay);
System.out.println(message + "+" + delay );
} catch (InterruptedException e) {
System.err.println("error here" );
}
}
你的程序实际上有2
错误:
到目前为止,您仅在收到InterruptedException
时才打印消息,这是当您的线程在睡眠时被中断时引发的异常。 因此,不是在 catch 块中打印您的消息,您应该在sleep
后将其打印为下一个:
try {
Thread.sleep(delay);
System.out.println(message + "+" + delay );
} catch (InterruptedException e) {
// Re-set the interrupted flag
Thread.currentThread().interrupt();
}
由于您希望每 5 秒打印一次消息,您需要在无限循环中调用sleep
否则您的线程将只打印一次并死亡,因此代码应该在最后:
try {
while (true) {
Thread.sleep(delay);
System.out.printf("%s+%d%n", message, delay);
}
} catch (InterruptedException e) {
// Re-set the interrupted flag
Thread.currentThread().interrupt();
}
或者,您可以使用ScheduledExecutorService
使用方法scheduleAtFixedRate
以固定速率安排您的任务,您的代码将是:
// Create a ScheduledExecutorService of 2 threads
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
// Schedule my task every 5 seconds starting in 5 seconds
executor.scheduleAtFixedRate(new MyTask("Hello", 5000), 5L, 5L, TimeUnit.SECONDS);
// Schedule my task every 10 seconds starting in 10 seconds
executor.scheduleAtFixedRate(new MyTask("Bye ", 10000), 10L, 10L, TimeUnit.SECONDS);
MyTask
类将简单地是:
class MyTask implements Runnable {
String message;
int delay;
public MyTask(String s, int d) {
message = s;
delay = d;
}
public void run() {
System.out.printf("%s+%d%n", message, delay);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.