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