【问题标题】:Android Thread InstantiationAndroid 线程实例化
【发布时间】:2015-04-16 01:56:01
【问题描述】:

这里有一个问题: 在 Android 代码中,如果我声明了一个异步任务:

重要编辑:所有这些任务都通过执行器并行执行。我没有连续执行它们,在这种情况下,其中一些答案是显而易见的。

AsynchronousTask task1 = new AsynchronousTask();
task1.execute();

我在该任务完成之前实例化另一个任务:

task1 = new AsynchronousTask();

旧任务是否完成了它的工作,还是被垃圾回收器拾取?


如果我创建了一个等待 task1 完成的监听器:

FinishListener finishListener = new FinishListener()
{
    //do stuff
}
AsynchronousTask task1 = new AsynchronousTask(finishListener);
task1.execute();

我以这种方式覆盖 task1 并执行它:

task1 = new AsynchronousTask(finishListener);
task1.execute()

监听器会在旧任务 1 或新任务 1 完成时触发吗?


如果我重新实例化侦听器,这种情况会改变吗?

FinishListener finishListener = new FinishListener()
{
    //do stuff
}
AsynchronousTask task1 = new AsynchronousTask(finishListener);
task1.execute();
finishListener = new FinishListener()
{
    //do different stuff
}
task1 = new AsynchronousTask(finishListener);
task1.execute();

【问题讨论】:

    标签: java android multithreading asynchronous thread-safety


    【解决方案1】:

    如果您正在调用 execute,那么您就是在串行执行它们,因为这就是 Android 执行 AsyncTasks 的方式。要并行执行它们,您必须调用 executeOnExecutor(AsycTask.THREAD_POOL_EXECUTOR,params);

    但要回答您的问题,如果您确实有并行执行:

    1) 覆盖变量不会杀死线程。它将继续在后台运行

    2) 两者兼而有之。两个线程都传递了相同的侦听器。首先发生的是竞争条件

    3) 在这种情况下,当旧线程完成时将调用旧监听器,而当新线程完成时将调用新监听器。其中哪一个先发生是竞争条件。

    【讨论】:

    • 同意所有 3 点,但是 OP 确实提到使用执行器并行运行任务 - 即使他没有说明如何(如果?)正确配置。
    • 确实如此,我所说的在技术上仅适用于 1.6 和 3.0+。对于 2.x,它们真正并行运行。假设他针对的是较新的设备,我过于简化了。
    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多