> Java > Java베이스 > 본문

Java에서 정기적으로 작업을 실행하는 방법

angryTom
풀어 주다: 2019-11-14 16:41:36
원래의
5114명이 탐색했습니다.

Java에서 정기적으로 작업을 실행하는 방법

Java에서 정기적으로 메소드를 실행하는 방법

Java에서 타이밍 기능을 구현하는 방법에는 여러 가지가 있습니다.

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를 사용하면 지정된 시간에 작업을 시작할 수 있고 첫 번째 작업의 실행을 연기할 수 있다는 점에 주로 반영됩니다. 특정 시간 간격을 설정할 수도 있지만 원칙은 동일합니다. 스레드는 여전히 백그라운드에서 시작됩니다. 우리가 시작한 작업 수에 관계없이 작업을 실행하는 스레드는 하나만 있다고 해야 합니다. 그래서 문제가 발생하게 됩니다. 예를 들어, 한 작업이 완료되지 않고 다른 작업이 실행되기 시작하면 동시성 문제가 발생할 수 있습니다. 또한 작업에서 오류가 보고되면 스레드가 중지됩니다.

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 - TimerThread - TaskQueue - MyTask - run 관계입니다. 물론 최종 실행 방법은 사용자 지정 작업의 실행 방법이어야 합니다. 우리의 사용자 정의 작업은 TimeTask를 상속받았고 이 클래스는 Runnable 인터페이스를 구현했기 때문입니다.

3. ScheduledExecutorService 사용

ScheduledExecutorService는 예약된 작업을 구현하는 가장 이상적인 방법인 동시 도구 클래스로 도입되었습니다.

1. Timer의 단일 스레드와 비교하여 스레드 풀을 통해 작업을 실행합니다.

2. 작업의 첫 번째 실행에 대한 지연 시간을 유연하게 설정할 수 있습니다.

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);
    }
}
로그인 후 복사

php 중국어 웹사이트, 수많은 무료 Java 입문 튜토리얼, 온라인 학습을 환영합니다!

위 내용은 Java에서 정기적으로 작업을 실행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿