如何在while循环中以不同的休眠时间同时运行三个线程?

时间:2016-04-21 00:35:06

标签: java multithreading

我希望在while循环中同时运行三个不同的线程,并且等待时间不同。这是我的示例代码。

static void someFunction(){

    while(true){

        Thread t1 = new Thread(){
            public void run(){
                System.out.println("Thread 1");
                try {
                    Thread.currentThread();
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };

        Thread t2 = new Thread(){
            public void run(){
                System.out.println("Thread 2");
                try {
                    Thread.currentThread();
                    Thread.sleep(7000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };

        Thread t3 = new Thread(){
            public void run(){
                System.out.println("Thread 3");
                try {
                    Thread.currentThread();
                    Thread.sleep(8000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };


    }

}

是否可以同时在while循环中运行三个线程?还有其他任何方法可以实现吗?

预期产量: 线程1 线程2 Thread3 Thread1(5 SEC之后) 线程2(7秒后) Thread3(8秒后)

1 个答案:

答案 0 :(得分:2)

您无法控制线程的run()方法(或其run()方法调用的代码)之外的线程中的执行。外循环不是你想要的方式。它只是无休止地生成新线程。

由于除了消息和延迟之外线程是相同的,所以这是将这些数据转换为变量并且只有一段代码的完美情况:

public class MyThread extends Thread {
    private final long interval;
    private final String message;
    public MyThread(long interval, String message) {
        this.interval = interval;
        this.message = message;
    }

    @Override
    public void run() {
        while (!isInterrupted()) {
            System.out.println(message);
            try {
                sleep(interval);
            } catch (InterruptedException e) {
                return;
            }
        }
    }
}

请注意,我已将while(true)替换为while(!isInterrupted())。这是为了让您以有序的方式终止线程:只需中断它们。

您使用它的方式可能是:

static Thread t1, t2, t3;

static void someFunction() {
    t1 = new MyThread(5000, "Thread 1");
    t2 = new MyThread(7000, "Thread 2");
    t3 = new MyThread(8000, "Thread 3");
    // now start them all
    t1.start();
    t2.start();
    t3.start();
}

当您希望线程结束时,只需调用:

t1.interrupt();
t2.interrupt();
t3.interrupt();

您可能还想查看使用ThreadGroup。这是一种处理线程集合的便捷方式(惊喜!)一个组。