为了账号安全,请及时绑定邮箱和手机立即绑定

如何强制执行单例(一个全局实例)ScheduledExecutorService,一次一个任务?

如何强制执行单例(一个全局实例)ScheduledExecutorService,一次一个任务?

交互式爱情 2022-05-25 10:21:54
我有一个应用程序需要从服务器请求数据,有时作为一次性请求,有时它需要以固定速率轮询。对于一次性请求,我只使用这样的线程:    public void request() {        Thread requestThread = new Thread(this);        requestThread.start();    }这些没关系,它们执行然后就完成了。但是,对于长轮询任务,我似乎永远不能一次只执行其中一个。我想要的是以下方法:    public void longPoll() {        try {            pollingScheduledExecutor.scheduleAtFixedRate(this, 0, 3, TimeUnit.SECONDS);        } catch (Exception ignored) {        }    }只能存在一次,但现在发生的情况是,当我从第一堂课调用它时,它会正常开始,但在第二个任务调用后它永远不会停止。如何强制执行只有一个全局实例 this ScheduledExecutorService?对于上下文,这是这些方法所在的类:public abstract class AbstractCommunicationChannel implements Runnable {    static String SERVER_ADDRESS = "http://0.0.0.0";    private URL url;    private JSONObject requestObject;    private JSONObject responseObject;    private volatile ScheduledExecutorService pollingScheduledExecutor = Executors.newSingleThreadScheduledExecutor();    public void longPoll() {        try {            pollingScheduledExecutor.scheduleAtFixedRate(this, 0, 3, TimeUnit.SECONDS);        } catch (Exception ignored) {        }    }    public void request() {        Thread requestThread = new Thread(this);        requestThread.start();    }    AbstractCommunicationChannel(URL url, JSONObject requestObject) {        this.url = url;        this.requestObject = requestObject;    }    /**     * This is the general purpose tool for hitting the server and getting a response back.     */    public void run() {        Log.i("requestObject", requestObject.toString());        try {            HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();            httpUrlConnection.setDoOutput(true);            httpUrlConnection.setRequestMethod("POST");            httpUrlConnection.setRequestProperty("Content-Type", "application/json; charset=utf-8");            }}
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

又是我。


如果您只想要一个正在运行的轮询任务,则必须取消前一个(如果已经存在)。


例子:


private static final Object lock = new Object();

private static ScheduledFuture<?> currentRunningTask;


    public void longPoll() {


        synchronized (lock) {


            if (currentRunningTask != null) {

                currentRunningTask.cancel(true);

            }


            try {

                currentRunningTask = pollingScheduledExecutor.scheduleAtFixedRate(this, 0, 3, TimeUnit.SECONDS);

            } catch (Exception ignored) {

                ignored.printStackTrace();

            }

        }

    }


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号