Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计划每隔几秒钟运行一次DexecutorService_Java_Concurrency_Timer_Ejb - Fatal编程技术网

Java 计划每隔几秒钟运行一次DexecutorService

Java 计划每隔几秒钟运行一次DexecutorService,java,concurrency,timer,ejb,Java,Concurrency,Timer,Ejb,我正在尝试使用ScheduledExecutorService在EJB中每隔几秒钟运行一次。然而,它似乎确实起了作用。我不确定我是否做错了什么。我发现这个网站: 我想每隔几秒钟运行一些代码。我不确定这是否是并发,因为我只想在一个重复运行的线程上执行。代码如下: @Startup @Singleton public class StartUp { private ScheduledExecutorService executor; @PostConstruct publ

我正在尝试使用ScheduledExecutorService在EJB中每隔几秒钟运行一次。然而,它似乎确实起了作用。我不确定我是否做错了什么。我发现这个网站:

我想每隔几秒钟运行一些代码。我不确定这是否是并发,因为我只想在一个重复运行的线程上执行。代码如下:

@Startup
@Singleton
public class StartUp {

    private ScheduledExecutorService executor;

    @PostConstruct
    public void start() {
         executor = Executors.newScheduledThreadPool(1);
         Runnable runnable = new Runnable() {
             public void run() {
                 while(true) {
                     System.out.println("i");
                     // after send an e-mail
                 }
             }
         };
         ScheduledFuture<?> scheduledFuture = executor.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
    }
}
@启动
@独生子女
公营创业{
专用ScheduledExecutorService执行器;
@施工后
公开作废开始(){
executor=Executors.newScheduledThreadPool(1);
Runnable Runnable=新的Runnable(){
公开募捐{
while(true){
系统输出打印号(“i”);
//发送电子邮件后
}
}
};
ScheduledFuture ScheduledFuture=executor.scheduleAtFixedRate(可运行,0,1,时间单位.s);
}
}
这似乎没有运行。我做错了什么


有什么想法吗?

在使用EJB时,您不应该创建自己的线程池,而是让容器为您创建线程池。您应该有类似于:

@Singleton
public class TimerService {
    @EJB
    HelloService helloService;

    @Schedule(second="*/1", minute="*",hour="*", persistent=false)
    public void doWork(){
        System.out.println("timer: " + helloService.sayHello());
    }
}

您已配置了数百万秒的初始延迟(
new Date().getTime()
),然后您将在任务有机会执行之前取消该任务。我希望立即启动该任务,然后每隔一秒重新运行一次。我将取消方法。应该添加什么来代替新的Date().getTime()?
executor.scheduleAtFixedRate(可运行,0,1,TimeUnit.SECONDS)谢谢。这是可行的,但我想做的是每隔几秒钟运行一次线程。因此,如果我取出while循环,它只打印一次“I”,然后它就不执行了。我错过什么了吗?我需要重复运行。据我所知,除非程序终止,否则计划将每秒运行一次。在主线程上是否有一个sleep()来阻止程序终止?