安排无限的线程

时间:2014-02-28 04:42:02

标签: java multithreading spring-mvc

我需要创建一个无限运行的线程,作为一个带有Spring MVC控制器的独立进程。

线程将在第一次触发控制器时启动。每次控制器被击中时我都不想重新安排。

@RequestMapping(method = RequestMethod.GET)
public String runTask() {

    //I want this to be scheduled first time controller is hit but 
    //I don't want it to rechadule every time it is hit again
    ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
        exec.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            // do stuff
        }
    }, 0, 5, TimeUnit.SECONDS);


    return "Task was scheduled to run";
}

Java Thread every X seconds

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

只需将其添加到控制器

即可
@PostConstruct
public void init(){
    //call executor here
}

答案 1 :(得分:0)

您可以分离线程执行的逻辑和控制器初始化执行程序,如下所示:

public class MapDecoratorQueue {
    //inject it
    MyXExecutor myXExecutor;

    @RequestMapping(method = RequestMethod.GET)
    public String runTask() {
        myXExecutor.setRunning(true);
        return "Task was scheduled to run";
    }
}

//Inject this into MapDecoratorQueue in spring config 
class MyXExecutor{
    private final ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    private volatile boolean isRunning = false;

    public MyXExecutor(){
        exec.scheduleAtFixedRate( new Runnable(){

            @Override
            public void run() {
                if(isRunning){
                    //do stuff
                }
            }
        }, 0, 5, TimeUnit.SECONDS);
    }

    public void setRunning(boolean running) {
        isRunning = running;
    }
}

将运行逻辑置于isRunning值的检查之下。如果你不想首先启动执行程序,直到你第一次命中,你可以使用相同的方法,你可以从控制器调用一个方法,如果它没有初始化,将启动执行程序。

希望这有帮助。