【问题标题】:How to stop asynchronous thread after 5 seconds of running如何在运行 5 秒后停止异步线程
【发布时间】:2010-11-24 22:00:43
【问题描述】:

必须创建线程并运行 5 秒,然后我想停止。我该怎么做?

我对时间/毫秒无能为力。

谢谢。

【问题讨论】:

  • 你想跑 5 秒,而不用时间做任何事情?什么?

标签: android multithreading asynchronous


【解决方案1】:

java 中的线程是协作的——你不能强行停止一个线程。你能做的就是发出信号让它停止(调用interrupt()或引发一个标志),然后代码自愿停止。

所以:

  1. 开始运行您的工作线程。在其中反复(在主工作循环内)检查isInterrupted() 并捕获任何InterruptedExceptions - 在这种情况下退出线程。

  2. 启动 TimerTask 运行 5 秒,然后在工作线程上调用 interrupt()

更新: 发帖人解释说他已经有一个工作代码,他只需要异步运行它而不阻塞 UI。

解决方案:设置 AsyncTask 并在其 doInBackground() 方法中运行您的代码。

【讨论】:

    【解决方案2】:

    使用AsyncTask.cancel(true) 方法。

    【讨论】:

    • 这看起来很有希望。而且,我可以在 5 秒后使用 postDelayed 取消我的 AsyncTask 吗?谢谢。
    【解决方案3】:

    抱歉这里没有说清楚。这是我的同步线程示例。 我的函数 listen() 运行 5 秒然后退出。 Listen() 是一个 UDP 监听器...

    此代码存在问题,它会停止我的主线程(我的手机变得无响应),直到listed() 完成其5 秒的运行。我想使用异步线程来避免我的手机死机。当我说我不能对时间做任何事情时,我想说我不能在 listen() 函数中放置某种计时器,然后测量经过的时间,然后在 5 秒后退出。做不到。

    Thread t = new Thread() {
        public void run() {
            try {
                listen();
            } catch (IOException e) {
                Log.d(TAG, "IOException (Discovery) " + e);
                e.printStackTrace();
            }
            synchronized (this) {
                notifyAll();
            }
        }
    };
    synchronized (t) {
        t.start();
        try {
            t.join(5000); // 5 sec
    
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 设置 AsyncTask 并在其 doInBackground() 方法中运行此代码。
    猜你喜欢
    • 2023-01-05
    • 2011-07-22
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多