首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有Runnable和CountdownLatch的CountdownLatch替代方案

具有Runnable和CountdownLatch的CountdownLatch替代方案
EN

Code Review用户
提问于 2015-06-26 07:33:12
回答 2查看 3K关注 0票数 1

这种模仿AsyncTask功能的模式有什么问题?:

代码语言:javascript
复制
// on the UI thread
final CountDownLatch latch = new CountDownLatch(1);
onPreexecuteWrapper();
new Thread(new Runnable() {
        doInBackgroundWrapper();
        latch.countDown();
    }
}).start();

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
                latch.await();
        } catch (InterruptedException e) {
            Logger.error(TAG, "Not good.");
        }

    context.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            onPostExecuteWrapper();
        }
    });
}
}).start();

我认为这是错误的:

  • 两个线程->更多的资源(实际上我没有比较,只是猜测)。
  • 没有进度更新功能。
  • 好像臭死了。
EN

回答 2

Code Review用户

回答已采纳

发布于 2015-06-26 08:02:56

第一件事情是错误的,那就是你正在重新发明一个轮子。

第二,为什么不放弃CountDownLatch,直接在第一个可运行的地方执行context.runOnUiThread呢?

代码语言:javascript
复制
// on the UI thread

onPreexecuteWrapper();
new Thread(new Runnable() {
    @Override
    public void run() {
        doInBackgroundWrapper();
        context.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                onPostExecuteWrapper();
            }
        });
    }
}).start();

最后一件事是,与其生成新线程,不如使用ExecutorThreadPool

票数 3
EN

Code Review用户

发布于 2015-06-26 21:47:37

看起来很臭??很臭..。

我感到奇怪的第一件事是压痕:

@覆盖公共void (){ try { latch.await();}InterruptedException e) {Logger.error(标记,“不好”);}context.runOnUiThread(新的Runnable() {

这段代码给人一种错误的印象,认为它在捕获InterruptedException之后就停止了。

应该是这样的:

代码语言:javascript
复制
@Override
public void run() {
    try {
            latch.await();
    } catch (InterruptedException e) {
        Logger.error(TAG, "Not good.");
    }

    context.runOnUiThread(new Runnable() {

擦伤那个..。首先,让我们在甲骨文“并发要点”中阅读:

中断是对线程的指示,它应该停止它正在做的事情,并做一些其他的事情。

无论你做什么,InterruptedException基本上都是一滴。在那之后继续执行基本上是没有意义的。这意味着catch块应该更符合.

代码语言:javascript
复制
} catch (InterruptedException e) {
     logger.warning("Got interrupted while waiting on latch");
     Thread.currentThread().interrupt();
}

再一次,这里提出的整个结构似乎是一种过于复杂的方式来实现目标。

而不是不必要地创建线程。要完成任务,你应该有一个人把你所拥有的工作交给他们的一些人。

棘轮怪的答案中提到的解决方案已经存在

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/94751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档