Как передать аргументы методу выполнения таймерной задачи - PullRequest
4 голосов
/ 22 сентября 2011

У меня есть метод, и я хочу, чтобы он был запланирован для выполнения в более позднее время.Время планирования и аргументы метода зависят от пользовательского ввода.

Я уже пробовал таймеры, но у меня есть вопрос.

Как можно передать аргументы методу запуска Java TimerTask?

TimerTask timert = new TimerTask() 
{
     @Override
     public void run() 
     {
           //do something
     }
}   

Ответы [ 5 ]

27 голосов
/ 22 сентября 2011

Вы можете написать свой собственный класс, который выходит из класса TimerTask, и вы можете переопределить метод run.

class MyTimerTask extends TimerTask  {
     String param;

     public MyTimerTask(String param) {
         this.param = param;
     }

     @Override
     public void run() {
         // You can do anything you want with param 
     }
}
7 голосов
/ 22 сентября 2011

Вам нужно будет расширить TimerTask и создать поля конструктора и / или установщика. Затем установите нужные значения перед планированием TimerTask для выполнения.

1 голос
/ 22 сентября 2011

Невозможно изменить подпись метода run().

Однако вы можете создать подкласс TimerTask и дать ему какой-то метод initialize.Затем вы можете вызвать новый метод с нужными аргументами, сохранить их как поля в своем подклассе и затем ссылаться на эти инициализированные поля в run() -методе:

abstract class MyTimerTask extends TimerTask
{
  protected String myArg = null;
  public void init(String arg)
  {
    myArg = arg;
  }
}

...

MyTimerTask timert = new MyTimerTask() 
{
  @Override
  public void run() 
  {
       //do something
       System.out.println(myArg);
  }
} 

...

timert.init("Hello World!");
new Thread(timert).start();

Убедитесь, что поля установленывидимости для protected, поскольку поля private не видны (анонимным) подклассам MyTimerTask.И не забудьте проверить, инициализированы ли ваши поля в методе run().

1 голос
/ 22 сентября 2011

Единственный способ сделать это - создать собственный класс, который расширяет TimerTask и передает аргументы его конструктору или вызывает его установщики. Таким образом, задача будет «знать» свои аргументы с момента ее создания.

Более того, если он предоставляет сеттеры, вы можете изменить конфигурацию задачи даже позже, после того, как задача уже запланирована.

0 голосов
/ 27 августа 2018
class thr extends TimerTask{    
@Override
public void run(){
    System.out.println("task executed task executed .........." );
}               


class service { 
private Timer t;    
public void start(int delay){
    Timer timer=new Timer();
    thr task =new thr();                        
    timer.schedule(task, delay);        
    this.t=timer;
}   
public void stop(){
    System.out.println("Cancelling the task scheduller ");
    this.t.cancel();
}
}

public class task1 {
  public static void main(String[] args) {

    service sv=new service();
    sv.start(1000);
    System.out.println("This will check the asynchronous behaviour ");
    System.out.println("This will check the asynchronous behaviour ");
    System.out.println("This will check the asynchronous behaviour ");
    System.out.println("This will check the asynchronous behaviour ");
    System.out.println("This will check the asynchronous behaviour ");
    sv.stop();

  } 
}

приведенный выше код прекрасно работает для планирования и перепланирования задачи, которую можно установить, и сброса задачи с помощью функции таймера

...