我需要在一段时间后运行一些代码,而不会阻止当前的方法。
我尝试了以下两种方法:
public static void main(final String[] args) {
System.out.println("Start");
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("done");
this.cancel();
}
}, 4000L);
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(new Runnable() {
public void run() {
System.out.println("done");
}
}, 2, TimeUnit.SECONDS);
executor.shutdown();
System.out.println("Stop");
}
问题是第一个会阻止应用程序,第二个不允许main在完成之前退出;
如何在一段时间后运行代码并在安排后立即退出当前方法?
答案 0 :(得分:0)
您可以创建自己的线程并将其设置为守护程序:
final Thread myThread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(20000);
} catch (final InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("20 seconds over");
}
});
myThread.setDaemon(true);
myThread.start();
另一种方法是使用ThreadFactory创建Executor,在其中将创建的Thread设置为守护进程。你必须使用这些功能:
Excecutors.newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
答案 1 :(得分:0)
如果您希望创建的作业比创建它的Java进程更长,那么您将不得不启动另一个进程。 Commons exec可以提供帮助,因为从java启动进程并不像第一次出现那么简单。
如果将线程设置为守护进程然后进程退出,则守护程序线程也将被终止 - 其地址空间消失。
答案 2 :(得分:0)
答案 3 :(得分:0)
使用预定执行人: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html
它有一个计划方法,一个固定费率方法的计划和一个固定延迟方法的计划。