假设我有以下几点:

函数requestValue:我需要多次调用此函数。每次调用它时,它都应该计算一些值X,然后使用计算出的值作为参数调用另一个函数submitValue(X)。但是,如果在5秒钟内仍未完成计算,则应调用submitValue(-1)

请注意,这只是我为了使问题尽可能简单而需要的一个示例,这些函数不计算任何内容(sleep用于模拟超出时间限制的内容)。

我所做的是扩展Thread类,并添加了一个功能来将线程标记为已停止:

class myThread extends Thread{
    boolean stop = false;
    @Override
    public void run(){
        Random rand = new Random();
        try {
            Thread.sleep(200*rand.nextInt(10));
        } catch (InterruptedException ex) {
            Logger.getLogger(myClass.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (stop == false)
            submitValue(1);
    }
    void Stop(){
        stop = true;
    }
}


这是requestValue函数:

void requestValue(){
    myThread thread = new myThread();

    Timer myTimer = new Timer(1000 , new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent ae) {
                thread.Stop();
                submitValue(-1);
            }
        }
    );
    myTimer.setRepeats(false);
    myTimer.start();
    thread.start();
}


submitValue函数当前仅打印出参数(1或-1)。

当超过时间限制时,这将防止调用函数submitValue(1),但是始终会调用submitValue(-1)。如何让听众知道是否已调用submitValue(1),所以我不再调用它了?还有比我正在使用的方法更好的方法吗?

另一个问题是所有1都在所有-1之前打印,为什么会这样?

谢谢

最佳答案

几件事。首先,不要扩展Thread。实现一个Runnable,您可以根据需要匿名进行操作,并将其传递给Thread构造函数。

其次,不要创建第二个Timer线程。这太复杂了,可能是问题的根源。让主线程阻塞。

使用Thread.join(long millis)进行超时。如果线程仍处于活动状态,则设置“停止”标志。 (请注意,它应该是私有的volatile,并具有使它变为真的方法。volatile关键字将确保工作线程在更改时将看到该值。)然后返回-1。否则,返回计算值。

关于java - 限时功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47796324/

10-10 22:43