gpt4 book ai didi

java - 当对象不再位于列表中后,停止在对象内启动的线程吗?

转载 作者:行者123 更新时间:2023-12-01 14:15:29 24 4
gpt4 key购买 nike

假设我有一个名为 MyTask 的类

每次我为 MyTask 新建一个对象时,它都会创建一个线程

boolean mContinueThread = true;

public MyTask (Activity activity) {

new AsyncTask<Void, Void, Void>() {

@Override
protected Void doInBackground(Void... params) {
Thread thread = new Thread(new Runnable() {

@Override
public void run() {

while (mContinueThread) {

try {
Thread.sleep(1000);
} catch (InterruptedException e) {

}
}

}
});
thread.start();
return null;
};

}.execute();
}

首先我新建 myTask1、myTask2、myTask3,然后添加到列表中

List<MyTask> myTasks = new ArrayList<MyTask>;
myTasks.add(myTask1);
myTasks.add(myTask2);
myTasks.add(myTask3);

现在应该有3个线程在后台运行,然后我更新by

myTasks = new ArrayList<MyTask>;

看起来 myTask1、myTask2、myTask3 中的线程仍在运行,finalize 永远不会被调用。我知道在更新列表之前我可以将每个 MyTask 对象的 mContinueThread 设置为 true,但我想知道有什么方法(回调?)我可以知道那些 MyTask 对象不再不在列表中,然后将 mContinueThread 设置为假的?

public MyTask (Activity activity) {

...

@Override
protected void finalize() throws Throwable {
mContinueThread = false;
super.finalize();
}

最佳答案

拥有一个只启动线程的异步任务似乎是多余的。您可以通过将线程的状态直接放入AsyncTask$doInBackground()<来实现所需的结果

你可以调用AsyncTask$cancel(boolean mayInterrupt)方法,这会引发InterruptedException,剩下要做的就是添加一个return语句在捕获范围内:

    @Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// cancel was called
return null;
}
return null;
};

像这样取消任务:

myTasks.get(i).cancel(true);

不要忘记传递true,否则它将不起作用

关于java - 当对象不再位于列表中后,停止在对象内启动的线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18141257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com