java - 限时功能

标签 java multithreading swing timer

假设我有以下内容:

function 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)来进行超时。如果线程仍然处于 Activity 状态,请设置“停止”标志。 (注意,它应该是私有(private)的 volatile,并有一个方法使其为 true。 volatile 关键字将确保工作线程在更改时看到该值。)然后返回 -1。否则,返回计算值。

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

相关文章:

java - 即使设置了System.setErr(),也无法使用自定义PrintStream打印错误

java - 需要帮助在 Spring/Maven 上配置 MongoDB

java - 增加 JComboBox Popupmenu 的最大高度

Python 作用域和线程问题

java - 共享资源先到先得政策

Java Swing树: dynamically changing needed?

java - 按下按钮后 JPanel 不显示更新

java - 在 Java 中永久保存数据(并自动加载)?

java - Java 函数执行的时间限制

java - 将复选框添加到 DefaultTableModel