2012-02-23 27 views
22

Tôi là một người mới bắt đầu sử dụng Java và đã có nhiều giải pháp khác nhau cho vấn đề này và đã nhận được bản thân mình. Tôi đã thử với Chủ đề và sau đó phát hiện ra lớp Timer này và đã sai lầm với nó mà không thành công cho đến nay. Nếu bạn có thể đăng mã thực thi với phương thức chính để tôi có thể thấy nó hoạt động và bắt đầu chơi xung quanh từ đó, điều đó thật tuyệt.Cách sử dụng Lớp hẹn giờ để gọi phương thức, thực hiện điều gì đó, đặt lại hẹn giờ, lặp lại?

  1. Launch chương trình
  2. gọi doSomething()
  3. Tạo số ngẫu nhiên và thiết lập hẹn giờ cho rằng lâu.
  4. Khi Bộ hẹn giờ tắt, hãy gọi lại doSomething().

Có lẽ sử dụng này: http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

+0

Không làm điều này với Bộ hẹn giờ. Sử dụng một cái gì đó từ java.util.concurrent. Nó dễ hiểu hơn, hiệu quả hơn và mạnh mẽ hơn. Ví dụ của SimonC dưới đây là một cách tốt để làm điều đó. – kittylyst

Trả lời

32

Nếu bạn muốn chỉ đơn giản là sử dụng Timer, tôi sẽ làm một cái gì đó như thế này:

public class TestClass { 
    public long myLong = 1234; 

    public static void main(String[] args) { 
     final TestClass test = new TestClass(); 

     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       test.doStuff(); 
      } 
     }, 0, test.myLong); 
    } 

    public void doStuff(){ 
     //do stuff here 
    } 
} 

Xin lỗi vì nhận dạng tệ hại.

Ngoài ra, nếu bạn cần phải lên kế hoạch thực hiện các mã, hãy nhìn vào Guava Services vì nó thực sự có thể làm cho mã của bạn rõ ràng hơn nhiều và trừu tượng khá nhiều bản mẫu của việc tạo ra chủ đề, lịch, vv

Bằng theo cách này, tôi đã không gặp rắc rối khi tạo ra số ngẫu nhiên, v.v., nhưng tôi nghĩ bạn có thể tìm ra cách bao gồm phần đó. Tôi hy vọng điều này là đủ để giúp bạn đi đúng hướng.

Đối với hồ sơ, nếu bạn đã sử dụng ổi, nó sẽ giống như thế này:

class CrawlingService extends AbstractScheduledService { 

    @Override 
    protected void runOneIteration() throws Exception { 
     //run this alot 
    } 

    @Override 
    protected void startUp() throws Exception { 
     //anything you need to step up 
    } 

    @Override 
    protected void shutDown() throws Exception { 
     //anything you need to tear down 
    } 


    @Override 
    protected Scheduler scheduler() { 
     return new CustomScheduler() { 
      @Override 
      protected Schedule getNextSchedule() throws Exception { 
       long a = 1000; //number you can randomize to your heart's content 
       return new Schedule(a, TimeUnit.MILLISECONDS); 
      } 
     }; 
    } 
} 

Và bạn chỉ đơn giản là sẽ tạo ra một chính mà gọi CrawlingService.start mới(); đó là nó.

0

This page có một ví dụ điển hình của việc sử dụng Timer s và TimerTask s mà bạn có thể tinh chỉnh cho các nhu cầu của bạn.

22

Bạn có muốn cụ thể là Timer không? Nếu không, bạn có thể tốt hơn với một số ScheduledExecutorService và gọi số scheduleAtFixedRate hoặc scheduleWithFixedDelay; trích dẫn Javadocs:

Java 5.0 đã giới thiệu gói java.util.concurrent và một trong những tiện ích đồng thời trong đó là ScheduledThreadPoolExecutor mà là một hồ bơi thread cho nhiều lần thực hiện nhiệm vụ tại một tỷ lệ nhất định hoặc chậm trễ. Đó là một cách hiệu quả để thay thế linh hoạt hơn cho sự kết hợp Timer/TimerTask, vì nó cho phép nhiều luồng dịch vụ, chấp nhận đơn vị thời gian khác nhau, và không đòi hỏi subclassing TimerTask (chỉ thực hiện Runnable). Định cấu hình ScheduledThreadPoolExecutor bằng một chuỗi làm cho nó tương đương với Timer.

CẬP NHẬT

Dưới đây là một số mã làm việc sử dụng một ScheduledExecutorService:

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

public class Test { 
    public static void main(String[] args) { 
     final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); 
     ses.scheduleWithFixedDelay(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(new Date()); 
      } 
     }, 0, 1, TimeUnit.SECONDS); 
    } 
} 

Kết quả trông giống như:

Thu Feb 23 21:20:02 HKT 2012 
Thu Feb 23 21:20:03 HKT 2012 
Thu Feb 23 21:20:04 HKT 2012 
Thu Feb 23 21:20:05 HKT 2012 
Thu Feb 23 21:20:06 HKT 2012 
Thu Feb 23 21:20:07 HKT 2012 
2

Hãy nghĩ về một tình huống mà tôi muốn mã của mình thực thi tại một thời điểm cụ thể trong ứng dụng của tôi hoặc đôi khi sau đó từ thời điểm hiện tại. Nói cách khác, tôi muốn lên lịch cho công việc của mình vào thời điểm nhất định.

Java Timer lớp (java.util.Timer) cho phép ứng dụng lên lịch công việc trên một chuỗi nền riêng biệt.

Dưới đây là đơn giản nhất example of Java Timer:

import java.util.Timer; 
import java.util.TimerTask; 
public class JavaTimer { 
    public static void main(String[] args){ 
    Timer timer = new Timer(); 
    TimerTask task = new TimerTask() { 
     @Override 
    public void run() { 
    System.out.println("Inside Timer Task" + System.currentTimeMillis()); 
     } 
    }; 

    System.out.println("Current time" + System.currentTimeMillis()); 
    timer.schedule(task, 10000,1000); 
    System.out.println("Current time" + System.currentTimeMillis()); 

    } 
} 

Output: 
Current time1455469505220 
Current time1455469505221 
Inside Timer Task1455469515222 
Inside Timer Task1455469516222 
Inside Timer Task1455469517222 
Inside Timer Task1455469518222 
Inside Timer Task1455469519222 
Inside Timer Task1455469520222 
Inside Timer Task1455469521222 
Inside Timer Task1455469522222 
Inside Timer Task1455469523222 
Inside Timer Task1455469524222 
Inside Timer Task1455469525222 
Inside Timer Task1455469526222 
Inside Timer Task1455469527222 
Inside Timer Task1455469528223 
Inside Timer Task1455469529223 and it goes on 

PHÂN TÍCH: Các cuộc gọi đến timer.schedule (nhiệm vụ, 10000,1000) sẽ sắp xếp công việc mà đang xảy ra để thực hiện lần đầu tiên (trên một chủ đề khác) sau 10 giây từ cuộc gọi này. Sau đó nó sẽ gọi lại sau khi trì hoãn 10 giây. Điều quan trọng cần đề cập ở đây là nếu nhiệm vụ không thể được bắt đầu sau 10 giây, cuộc gọi nhiệm vụ tiếp theo sẽ không nhận được tiền trước. Vì vậy, ở đây thời gian trễ giữa hai nhiệm vụ liên tiếp là cố định.

Nguồn: Java Timer Example

0

Nếu bạn không muốn sử dụng timer lớp và có thể sử dụng thạch anh sau đó thực hiện nó như thế nào. lớp học chính của tôi sẽ là

import com.google.common.util.concurrent.AbstractScheduledService; 
import org.quartz.CronScheduleBuilder; 
import org.quartz.JobBuilder; 
import org.quartz.JobDetail; 
import org.quartz.impl.StdSchedulerFactory; 
import org.quartz.*; 
import org.quartz.impl.StdSchedulerFactory; 
import static org.quartz.TriggerBuilder.newTrigger; 

import java.util.concurrent.CountDownLatch; 

public class Test { 


    public static void main(String[] args) throws Exception{ 


     CountDownLatch latch = new CountDownLatch(1); 


     //do schdeuling thing 
     JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity(
       "CronQuartzJob", "Group").build(); 

     // Create a Trigger that fires every 5 minutes. 
     Trigger trigger = newTrigger() 
       .withIdentity("TriggerName", "Group") 
       .withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")) 
       .build(); 

     // Setup the Job and Trigger with Scheduler & schedule jobs 
     final Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
     scheduler.start(); 
     scheduler.scheduleJob(job, trigger); 

     // 
     latch.await(); 

     Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        scheduler.shutdown(); 
        latch.countDown(); 
       }catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     })); 

    } 






} 

và lớp công việc sẽ

import org.quartz.Job; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 

public class SimpleJob implements Job { 


    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { 
     System.out.println("executing task!"); 
    } 


} 

tôi sẽ tạo ra một jar thực thi cho điều này và bắt đầu này sử dụng java -jar .. &Ctrl+C có thể ngăn chặn quá trình đó, nếu bạn muốn nó ở chế độ nền disown it

Các vấn đề liên quan