繁体   English   中英

在Java中自动执行方法

[英]Automating method execution in java

我有6个函数需要在特定的时间间隔内运行:

public void runFirst() {
    System.out.println("First method");
}

public void runSecond() {
    System.out.println("Second method");
}

public void runThird() {
    System.out.println("Third method");
}

public void runFourth() {
    System.out.println("Fourth method");
}

public void runFifth() {
    System.out.println("Fifth method");
}

public void runSixth() {
    System.out.println("Sixth method");
}

我需要在单击按钮后立即运行“第一个”,第二个必须在65秒之后,第二个必须在第二个之后20秒,第四个在第三个之后15秒,依此类推,在我使用Thread.sleep但是我将需要不眠不休。

最好的方法是什么,有人可以根据我的方法向我展示一些示例。

您可以使用Quartz。 单击按钮时,您可以获得系统当前时间,并添加新的计划作业以在特定日期和时间运行。 因此,Quartz会按时运行它。

另一种方法是创建一个新线程并在其上定义睡眠时间段,然后让其运行功能。

你为什么不能使用

Thread.sleep

并在不同的线程中运行此代码(然后,整个应用不会在睡眠中停止)

也许您想检查#wait(timeout)方法,即带有超时的方法。

引用:

“ ...线程处于休眠状态,直到经过指定的实时量为止……”

要在一段时间后运行任务,您应该使用Timer ,这是“线程安排任务以安排将来在后台线程中执行的工具”

它使您不必创建自己的线程:更少出错,更容易。 它可以管理多个计划任务。 但是请注意,这些任务应该是短暂的(其他任务将阻塞计时器用于调度目的的线程)。

使用ExecutorService 基本想法是这样的:

    // "Global" resource
    final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5); // Adjust threadpool size

    ...
    // inside onclick() processing        
    ScheduledFuture<Void> future1 = executorService.schedule(new Callable<Void>() {
        @Override Void call() {
            try {
                runFirst();
            } finally {
                scheduleFuture2();
            }
        }
    },
    65,
    TimeUnit.SECONDS);
    ...

    void scheduleFuture2() {            
        ScheduledFuture<Void> future2 = executorService.schedule(new Callable<Void>() {
            @Override Void call() {
                try {
                    runSecond();
                } finally {
                    scheduleFuture3();
                }                    
            }
        },
        20,
        TimeUnit.SECONDS);
    }

    ...

    void scheduleFuture3() {            
        ScheduledFuture<Void> future3 = executorService.schedule(new Callable<Void>() {
            @Override Void call() {
                try {
                    runThird();
                } finally {
                    scheduleFuture4();
                }                    
            }
        },
        15,
        TimeUnit.SECONDS);
    }
    ...
    // And so on

一些注意事项:

  • 如果runFirst()runSecond() ,...执行Swing / AWT UI操作,则应在这些方法内正确使用SwingUtilities.invokeLater
  • 当您不再使用此机制时,请不要忘记调用executorService.shutdown() 如果忘记了,您将“泄漏”线程。
  • 上面对Void的引用(大写的“ V”)是有意的:我们使用的是Void类,而不是void类型

使用ScheduledExecutorService

{
    ScheduledExecutorService worker = Executors.newScheduledThreadPool(1);
    worker.execute(() -> runFirst());
    worker.schedule(() -> runSecond(), 65, TimeUnit.SECONDS);
    worker.schedule(() -> runThird(), 85, TimeUnit.SECONDS);
    worker.schedule(() -> runFourth(), 100, TimeUnit.SECONDS);
    worker.schedule(() -> runFifth(), 110, TimeUnit.SECONDS);
    worker.schedule(() -> runSixth(), 115, TimeUnit.SECONDS);
    worker.shutdown();
}

如果由于某种原因不能使用Java 8,请使用Runnable的 匿名实现而不是Lambda表达式

// worker.schedule(() -> runSixth(), 115, TimeUnit.SECONDS);
worker.schedule(new Runnable(){
    @Override
    public void run() {
        runSixth();
    }}, 115, TimeUnit.SECONDS);

为您的方法创建一个Thread类和另一个Class

现在:

public class ThreadTest implements Runnable {

    private int functionNumber;
    private int time2start;
    private YourClass obj;

    public ThreadTest(int functionNumber, int time2start, YourClass obj) {
        this.functionNumber = functionNumber;
        this.time2start = time2start;
        this.obj = obj;
    }

    public void run() {
        try {
            Thread.currentThread().sleep(time2start);
        } catch (Exception ex) {
        }//Time Delay before executing methods
        switch (functionNumber) {
            case 1:
                obj.runFirst();
                break;
            case 2:
                obj.runSecond();
                break;
            case 3:
                obj.runThird();
                break;
            case 4:
                obj.runFourth();
                break;
            //keep adding
        }
    }
}



然后为您的方法类:

public class YourClass {

    public void runFirst() {
        System.out.println("First method");
    }

    public void runSecond() {
        System.out.println("Second method");
    }

    public void runThird() {
        System.out.println("Third method");
    }

    public void runFourth() {
        System.out.println("Fourth method");
    }

    public void runFifth() {
        System.out.println("Fifth method");
    }

    public void runSixth() {
        System.out.println("Sixth method");
    }
}



现在,这是按钮的onClick事件的方法:

//on button click

ThreadTest th1 = new ThreadTest(1, 0, obj);//here obj is YourClass
ThreadTest th2 = new ThreadTest(2, 65000, obj);//65 SECONDS
//... keep adding

Thread thread1 = new Thread(th1);
Thread thread2 = new Thread(th2);
//...keep adding

thread1.start();
thread2.start();
//...keep adding

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM