Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java主程序的后台实现事件侦听器?_Java - Fatal编程技术网

如何在java主程序的后台实现事件侦听器?

如何在java主程序的后台实现事件侦听器?,java,Java,嗨,我是一个初学者,如果我的问题听起来很幼稚,那么很抱歉 我想实现一个线程,它在后台运行并一直侦听。通过监听,我的意思是,假设它一直检查从主线程返回的值,如果vaue超过某个数字,它就会执行某个方法,或者说退出程序 如果你能给我一些想法或者至少让我参考一些有用的东西,那就太好了。你不会希望这个线程在循环中运行,不断地轮询值,因为那样会浪费处理 理想情况下,当值发生更改时,会主动通知侦听器。这将要求修改监视值的任何代码调用特殊方法。侦听器可能不需要在单独的线程中运行;这将取决于侦听器在收到通知时所

嗨,我是一个初学者,如果我的问题听起来很幼稚,那么很抱歉

我想实现一个线程,它在后台运行并一直侦听。通过监听,我的意思是,假设它一直检查从主线程返回的值,如果vaue超过某个数字,它就会执行某个方法,或者说退出程序


如果你能给我一些想法或者至少让我参考一些有用的东西,那就太好了。

你不会希望这个线程在循环中运行,不断地轮询值,因为那样会浪费处理

理想情况下,当值发生更改时,会主动通知侦听器。这将要求修改监视值的任何代码调用特殊方法。侦听器可能不需要在单独的线程中运行;这将取决于侦听器在收到通知时所做的操作

如果无法更改修改该值的代码,则最好每隔一段时间检查该值。您不会立即看到更改,并且可能会完全错过更改,因为该值在一个时间间隔内更改了多次


以下哪种解决方案最适合您的情况?

您可以在中找到一些关于使用线程的信息(如果您是Java并发的新手,我建议您先阅读本教程)。尤其可能对您有用(它显示了如何创建和启动新线程)。

我想您可以简单地为主线程使用gui组件,比如JTextField,
然后阅读有关事件处理的内容,您将很容易听到文本字段输入值的状态变化。

如果您只需要从另一个线程轮询结果,请尝试使用@Piotr建议的
java.util.concurrent
包。下面是一个具体的示例,您可以这样做:

import java.util.concurrent.*;

class Main{
    public static void main(String[] args) throws Exception{
        //Create a service for executing tasks in a separate thread
        ExecutorService ex = Executors.newSingleThreadExecutor();
        //Submit a task with Integer return value to the service
        Future<Integer> otherThread = ex.submit(new Callable<Integer>(){
            public Integer call(){
                //do you main logic here
                return 999;//return the desired result
            }
        }

        //you can do other stuff here (the main thread)
        //independently of the main logic (in a separate thread)

        //This will poll for the result from the main
        //logic and put it into "result" when it's available
        Integer result = otherTread.get();

        //whatever you wanna do with your result
    }
}
import java.util.concurrent.*;
班长{
公共静态void main(字符串[]args)引发异常{
//创建用于在单独线程中执行任务的服务
ExecutorService ex=Executors.newSingleThreadExecutor();
//向服务提交返回值为整数的任务
Future otherThread=ex.submit(new Callable()){
公共整数调用(){
//你知道这里的主要逻辑吗
return 999;//返回所需的结果
}
}
//你可以在这里做其他事情(主线程)
//独立于主逻辑(在单独的线程中)
//这将从主数据库中轮询结果
//逻辑并在可用时将其放入“结果”中
整数结果=otherTread.get();
//不管你想对结果做什么
}
}

希望这能有所帮助。

您正在寻找action listner。在这里查看它

谢谢您的回答。我最初考虑实现一个循环。实际上,我正在通过windows命令行执行一个外部进程,作为回报,我读取了一个需要跟踪的值。我得到了字符串格式和cas格式的响应t返回int以应用检查。我正在考虑通过Runtime.getRuntime().exec()继续调用此外部进程在循环中,每隔2秒检查一次值。以毫秒为单位并不敏感。你认为这样做明智吗?@Sara-你的计划听起来是一种适当的处理方法。我建议查看以创建一个线程,以固定间隔运行此检查。并接受答案provide是如何使用
ScheduledExecutorService
的一个很好的例子。我不想实例化GUI对象,浪费我不需要的处理。我正在寻找简单的解决方案。你可以看看rodion的答案。