如何中断这个runnable
How to interrupt this runnable
我在Whosebug
中阅读了很多关于通过抛出InterruptedException
来中断线程的问题和答案。
但是大多数答案都只使用了一个 for
循环,并且他们会不时地检查线程是否被中断:Thread.currentThread().isInterrupted()
.
我的代码是这样的:
public class UploadVideoRunnable implements Runnable {
@Override
public void run() {
isUploaded = new uploadMedia(title, uri);
}
}
How/Where我应该添加代码来检查线程是否被中断吗?
抱歉,如果这是一个菜鸟问题,但我已经搜索了很多 google 并且没有找到答案。
谢谢
编辑:更新代码,uploadMedia 是一个 class 而 不是 一个方法
"Interrupting" 这里需要 "cooperation"。
这意味着:您只能中断包含此类循环结构的调用...:
while (notDone) { doSomething(); Thread.sleep(); }
或类似的东西。这意味着:您将不得不查看该方法 uploadMedia() 并查看是否允许进行此类更改。因此,您可以将其更改为:
while (notDone) {
if(interrupted) {
notDone = false;
} else {
doSomething();
Thread.sleep();
}
}
当然,上面更像"pseudo-code";您必须填写详细信息。
或者,您可以查看 ExecutorServices;因为有一些方法可以强行阻止那些;见 here
编辑:这不应该改变任何事情。你看——你在那里调用了一个方法; class 的构造函数。可以肯定的是,该构造函数将调用 other 方法;其中一种 other 方法是 运行 较长时间来完成其上传工作的方法。
最后:请注意 interrupted 也可能类似于
if (externalThingy.hasBeenCancelled()) {
含义:您可能需要 添加 另一个参数到您的 class;上传者 class 可以通过某种方式查询以确定是否应该停止当前正在做的事情!
在 Android 中,您不能从外部中断/取消执行线程(Bionic 甚至没有实现 pthread_cancel()
)。 IE。任何线程都必须自行决定是应该终止(通过从 run()
返回)还是继续执行。通知某个线程它应该尽快终止的唯一方法是使用 interrupt()
/ isInterrupted()
对。应该终止的线程应该定期检查是否有人中断了它。因此,您必须将您的工作分成小块并在它们之间进行测试。如果您无法拆分它 - 您无事可做,只能等到该工作完成。
我在Whosebug
中阅读了很多关于通过抛出InterruptedException
来中断线程的问题和答案。
但是大多数答案都只使用了一个 for
循环,并且他们会不时地检查线程是否被中断:Thread.currentThread().isInterrupted()
.
我的代码是这样的:
public class UploadVideoRunnable implements Runnable {
@Override
public void run() {
isUploaded = new uploadMedia(title, uri);
}
}
How/Where我应该添加代码来检查线程是否被中断吗?
抱歉,如果这是一个菜鸟问题,但我已经搜索了很多 google 并且没有找到答案。
谢谢
编辑:更新代码,uploadMedia 是一个 class 而 不是 一个方法
"Interrupting" 这里需要 "cooperation"。
这意味着:您只能中断包含此类循环结构的调用...:
while (notDone) { doSomething(); Thread.sleep(); }
或类似的东西。这意味着:您将不得不查看该方法 uploadMedia() 并查看是否允许进行此类更改。因此,您可以将其更改为:
while (notDone) {
if(interrupted) {
notDone = false;
} else {
doSomething();
Thread.sleep();
}
}
当然,上面更像"pseudo-code";您必须填写详细信息。
或者,您可以查看 ExecutorServices;因为有一些方法可以强行阻止那些;见 here
编辑:这不应该改变任何事情。你看——你在那里调用了一个方法; class 的构造函数。可以肯定的是,该构造函数将调用 other 方法;其中一种 other 方法是 运行 较长时间来完成其上传工作的方法。
最后:请注意 interrupted 也可能类似于
if (externalThingy.hasBeenCancelled()) {
含义:您可能需要 添加 另一个参数到您的 class;上传者 class 可以通过某种方式查询以确定是否应该停止当前正在做的事情!
在 Android 中,您不能从外部中断/取消执行线程(Bionic 甚至没有实现 pthread_cancel()
)。 IE。任何线程都必须自行决定是应该终止(通过从 run()
返回)还是继续执行。通知某个线程它应该尽快终止的唯一方法是使用 interrupt()
/ isInterrupted()
对。应该终止的线程应该定期检查是否有人中断了它。因此,您必须将您的工作分成小块并在它们之间进行测试。如果您无法拆分它 - 您无事可做,只能等到该工作完成。