在指定时间内在java中执行任务

时间:2015-10-15 20:07:54

标签: java arraylist delay

我想在Java中用5ms执行几行代码。以下是我的代码片段:

public void delay(ArrayList<Double> delay_array, int counter_main) {
    long start=System.currentTimeMillis();
        ArrayList<Double> delay5msecs=new ArrayList<Double>();
    int index1=0, i1=0;

    while(System.currentTimeMillis() - start <= 5)
    {
        delay5msecs.add(i1,null);
        //System.out.println("time");
        i1++;
    }
    for(int i=0;i<counter_main-1;i++) {
        if(delay5msecs.get(i)!=null) {
            double x1=delay_array.get(i-index1);
            delay5msecs.add(i,x1);
            //System.out.println(i);
        } else {
            index1++;
            System.out.println("index is :"+index1);
        }
    }
}

现在问题是整个数组都填充了空值,我也得到了一些与索引相关的异常。基本上,我想用0到5ms填充我的数组列表并发布填充其他数组列表中的数据。很长一段时间以来我都没有完成编码。感谢您的帮助。 谢谢。

1 个答案:

答案 0 :(得分:0)

System.currentTimeMillis()可能没有5ms所需的分辨率。无论如何,Windows上的粒度可能不会超过15ms,因此您的代码对平台非常敏感,实际上可能无法满足您的需求。

您需要的解决方案可能适用于System.nanoTime(),但同样,您可能需要研究平台限制。我记得你不能只是扩大你获得的价值,让它在任何地方都能发挥作用。

如果您可以保证没有其他线程运行此代码,那么我认为一个天真的循环和填充将起作用,而不必实现等待填充线程完成的工作线程。

您应该尝试使用Collection实用程序和for-each循环,而不是在第二部分中执行所有这些索引数学。

我想我也应该警告你,普通JVM中的任何内容都不能保证是实时的。因此,如果您需要 hard ,可靠,可重复的5ms,您可能会运气不佳。