线程中的递归run()

时间:2014-05-22 20:47:23

标签: java multithreading recursion

当我写一个帖子时,我有一个想法。我在考虑类似的事情:

class myThread extends Thread {
    public void run(){
        if(condition){
            //doSomething
        } else {
            sleep(10000);
            run();
        }
    }
}

我可以这样做吗?我确信这不是一个好的编码风格,但还有什么可以反对这个吗?

3 个答案:

答案 0 :(得分:0)

你冒着StackOverflowError这样做的风险,因为堆栈只会增长,直到不再满足条件。非递归地执行此操作更简单。

public void run() {
    while(condition) {
        doSomething();
    }
}

答案 1 :(得分:0)

只需使用无限循环和volatile布尔标志。您也可以从线程外部更新flag以随时退出线程(停止线程)。

class myThread extends Thread {
    private volatile boolean flag;

    public void run(){
        while(flag){
            if(condition){
               flag = false;
               break;
            }
            //doSomething
        }
    }
}

答案 2 :(得分:0)

从技术上讲,没有人反对从内部递归调用run()。不过,我建议将代码移动到Runnable然后由线程运行,因为它是设计为子类Thread和覆盖run以实现的不好的设计任务:

public class MyTask implements Runnable {
    public void run() {
        // ...
        run(); // recursive call
        // ...
    }
}

// somewhere else:
Thread thread = new Thread(new MyTask());
thread.start();

// or even better:
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new MyTask());