繁体   English   中英

java简单线程,但是不能运行

[英]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错误:

1. 在正常流程中打印您的消息

到目前为止,您仅在收到InterruptedException时才打印消息,这是当您的线程在睡眠时被中断时引发的异常。 因此,不是在 catch 块中打印您的消息,您应该在sleep后将其打印为下一个:

try {
    Thread.sleep(delay);
    System.out.println(message + "+" + delay );
} catch (InterruptedException e) {
    // Re-set the interrupted flag
    Thread.currentThread().interrupt();
}

2.添加无限循环

由于您希望每 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();
}

3. 奖金

或者,您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM