Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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创建后台线程的最佳方法_Java_Multithreading_Background Thread - Fatal编程技术网

用java创建后台线程的最佳方法

用java创建后台线程的最佳方法,java,multithreading,background-thread,Java,Multithreading,Background Thread,创建每15分钟运行一次的后台线程以从数据库获取数据的最佳方法是什么 下面是我拥有的代码,我想它在生产中可以很好地工作,但是有没有其他更好的方法,或者我应该知道的东西 private static void checkDatabaseEveryXMinutes() { new Thread() { public void run() { while (true) { try {

创建每15分钟运行一次的后台线程以从数据库获取数据的最佳方法是什么

下面是我拥有的代码,我想它在生产中可以很好地工作,但是有没有其他更好的方法,或者我应该知道的东西

private static void checkDatabaseEveryXMinutes() {
    new Thread() {
        public void run() {
            while (true) {
                try {
                    Thread.sleep(checkingAfterEveryXMinutes);
                    getDataFromDatabase();
                } catch (InterruptedException ex) {
                    //log here
                } catch (Exception e) {
                    //log here
                }
            }
        }
    }.start();
}
使用上述代码有什么缺点吗。ScheduledExecutorService与TimerTask相比如何

哪条路更好

如果有更好的方法,我将非常感谢基于我代码的任何示例。

您可以尝试使用和

例如:-


蒂蒂是对的。如果在应用程序服务器中使用它,则可以使用特定服务器的ejbtimer服务

ScheduledExecutorService将返回一个Future,其中有一个附加方法来检查Runnable是否已完成。两者都有取消Runnable的方法。对于像这样重复的任务,检查是否完成可能没有多大用处。然而,它是在JDK1.5并发api中引入的,它肯定应该用来代替旧的并发/线程api(Timer和TimerTask是JDK1.3)。它们将更加健壮,性能更好。它们有一个与java文档中的用例非常相似的示例

以下是一个示例:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class ScheduledTaskExample {
    private final ScheduledExecutorService scheduler = Executors
        .newScheduledThreadPool(1);

    public void startScheduleTask() {
    /**
    * not using the taskHandle returned here, but it can be used to cancel
    * the task, or check if it's done (for recurring tasks, that's not
    * going to be very useful)
    */
    final ScheduledFuture<?> taskHandle = scheduler.scheduleAtFixedRate(
        new Runnable() {
            public void run() {
                try {
                    getDataFromDatabase();
                }catch(Exception ex) {
                    ex.printStackTrace(); //or loggger would be better
                }
            }
        }, 0, 15, TimeUnit.MINUTES);
    }

    private void getDataFromDatabase() {
        System.out.println("getting data...");
    }

    public void shutdowh() {
        System.out.println("shutdown...");
        if(scheduler != null) {
            scheduler.shutdown();
        }
    }

    public static void main(String[] args) {
        final ScheduledTaskExample ste = new ScheduledTaskExample();
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                ste.shutdowh();
            }
        });
        ste.startScheduleTask();

    }
}
导入java.util.concurrent.Executors;
导入java.util.concurrent.ScheduledExecutorService;
导入java.util.concurrent.ScheduledFuture;
导入java.util.concurrent.TimeUnit;
公共类ScheduledTaskExample{
private final ScheduledExecutorService scheduler=执行者
.newScheduledThreadPool(1);
公共无效startScheduleTask(){
/**
*不使用此处返回的taskHandle,但可用于取消
*任务,或检查任务是否已完成(对于重复性任务,则不是
*(将非常有用)
*/
最终ScheduledFuture taskHandle=scheduler.scheduleAtFixedRate(
新的Runnable(){
公开募捐{
试一试{
getDataFromDatabase();
}捕获(例外情况除外){
例如printStackTrace();//或者loggger会更好
}
}
},0,15,时间单位为分钟);
}
私有void getDataFromDatabase(){
System.out.println(“获取数据…”);
}
公共空间{
System.out.println(“关机…”);
if(调度程序!=null){
scheduler.shutdown();
}
}
公共静态void main(字符串[]args){
最终ScheduledTaskExample ste=新ScheduledTaskExample();
Runtime.getRuntime().addShutdownHook(新线程(){
公开募捐{
ste.shutdowh();
}
});
ste.startScheduleTask();
}
}

@SLaks谢谢您的建议。我能问你为什么要推荐这个,而不是我上面提到的解决方案吗?@TechGeeky Easy。按照您的方法,您必须编写自己的循环来睡眠并重新提交。使用
ScheduledExecutorService
,您只需
ScheduleAFixedRate
(或
scheduleWithFixedDelay
),一切都会自动处理。@ChrisJester Young,谢谢您的帮助。你能提供一个简单的例子来说明我的代码吗?因为没有人举过一个例子如何使用它。因此,任何帮助都将不胜感激。…+1因为我同意你的答案,但正如OP在问题评论中所说的,你可能想给他们写一个例子,这样他们就不会打自己的脚了。:-)我想这是无可争辩的。。添加了示例:)添加了一个重要的编辑!确保在关键代码周围放置try/catch,以防引发异常。否则,异常将杀死线程并停止其定时执行。它工作得非常完美。谢谢阿尔珀。但我不明白为什么我的原创作品不起作用。我使用传统的Thread类来创建runnable。创建了类并运行它。线程运行。但它阻止了我所有其他的电话。原来的主线程不是事后执行的。嗯,这是不应该发生的,但是如果没有看到你的代码,很难说为什么:-/如果你想发布它(可能是一个新问题,然后是这里的链接),我可以看看。
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class ScheduledTaskExample {
    private final ScheduledExecutorService scheduler = Executors
        .newScheduledThreadPool(1);

    public void startScheduleTask() {
    /**
    * not using the taskHandle returned here, but it can be used to cancel
    * the task, or check if it's done (for recurring tasks, that's not
    * going to be very useful)
    */
    final ScheduledFuture<?> taskHandle = scheduler.scheduleAtFixedRate(
        new Runnable() {
            public void run() {
                try {
                    getDataFromDatabase();
                }catch(Exception ex) {
                    ex.printStackTrace(); //or loggger would be better
                }
            }
        }, 0, 15, TimeUnit.MINUTES);
    }

    private void getDataFromDatabase() {
        System.out.println("getting data...");
    }

    public void shutdowh() {
        System.out.println("shutdown...");
        if(scheduler != null) {
            scheduler.shutdown();
        }
    }

    public static void main(String[] args) {
        final ScheduledTaskExample ste = new ScheduledTaskExample();
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                ste.shutdowh();
            }
        });
        ste.startScheduleTask();

    }
}