最新公告
  • 欢迎您光临立业阁,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • java如何定时执行任务_Java教程


    java如何定时执行一个方法

    java实现定时功能有多种方式,下面介绍3种:

    1、创建一个线程.

    import java.util.Date;
    public class ThreadTest {
        public static void main(String[] args) {
            // 设置执行周期
            final long timeInterval = 3000;
            
            Runnable runnable = new Runnable() {
                public void run() {
                    while (true) {
                        System.out.println("Task Run ... " + new Date());
                        
                        try {
                            Thread.sleep(timeInterval);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            Thread thread = new Thread(runnable);
            thread.start();
        }
    }

    2、使用 JDK 自带的 API Timer 以及 TaskTimer。

    这种方式和第一种简单粗暴的方式有什么区别呢,主要体现在使用 API 可以在指定的时间开始启动任务,可以延期执行首次任务,同样也看可以设置一定的时间间隔,但是原理是是一样的,后台还是启动了一个线程,应该说是只有一个线程在执行任务,不管我们启动的 Task 有几个。所以这也会有问题,比方说一个一个任务没有执行完成,另一个任务就开始执行了,可能会发生并发问题。还有若是一个任务中报错,则线程就会被停止。

    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class MyTask extends TimerTask{
    
        private String name;
        
        public MyTask(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public void run() {
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = sf.format(new Date());
            System.out.println("exec MyTask ... 当前时间为:" + format);
            System.out.println(this.name +" 正在执行!" + sf.format(new Date()));
        }
        
        public static void main(String[] args) {
            Timer timer = new Timer();
            TimerTask task1 = new MyTask("Tasks 1");
            TimerTask task2 = new MyTask("Tasks 2");
            
            Calendar calendar1 = Calendar.getInstance();
            calendar1.add(Calendar.SECOND, 3);
            Calendar calendar2 = Calendar.getInstance();
            calendar2.add(Calendar.SECOND, 5);
            
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = sf.format(new Date());
            System.out.println("当前时间为:" + format);
            
            timer.schedule(task1, calendar1.getTime(), 3000L);
            timer.schedule(task2, calendar2.getTime(), 3000L);
        }
    
    }

    其实在 Timer 中,封装了一个 Task 的队列和 Time 的线程对象,我们自定义的 Task 的引用会放在队列中等待执行。

    大致是这么一个关系 Timer – TimerThread – TaskQueue – MyTask – run 当然最终执行的方法肯定是我们自定义任务中的 run 方法。因为我们自定义的任务已经继承了 TimeTask ,而这个类已经实现了 Runnable 接口。

    3、使用ScheduledExecutorService

    ScheduledExecutorService是做为并发工具类被引进的,这是最理想的定时任务实现方式。

    1.相比于Timer的单线程,它是通过线程池的方式来执行任务的。

    2.可以很灵活的去设定第一次执行任务delay时间。

    3.提供了良好的约定,以便设定执行的时间间隔。

    import java.util.Date;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    public class qwe {
        public static void main(String[] args) {
            //新建定时任务
            Runnable runnable = new Runnable() {
                //run方法中是定时执行的操作
                public void run() {
                    System.out.println(new Date());
                }
            };
            ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
            /*
             * 参数一:command:执行线程
             * 参数二:initialDelay:初始化延时
             * 参数三:period:两次开始执行最小间隔时间
             * 参数四:unit:计时单位
             */
            service.scheduleAtFixedRate(runnable, 0, 60, TimeUnit.SECONDS);
        }
    }

    liyege.cn,大量的免费Java入门教程,欢迎在线学习!

    以上就是java如何定时执行任务的详细内容,更多请关注liyege.cn其它相关文章!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    • 1154会员总数(位)
    • 111856资源总数(个)
    • 6本周发布(个)
    • 0 今日发布(个)
    • 240稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
    冀ICP备19022365号-1 百度地图

    侵权联系邮箱[email protected]

    立业阁(www.liyege.cn)免费提供wordpress主题模板、dedecms模板、帝国cms模板、小说网站源码、电影网站源码以及网络技术分享,建站源码,小说模板,电影模板,网赚教程,VPS推荐