我在java android平台上工作。我正在从主线程创建一个子线程。我想停止子线程作为我的要求。我的子线程具有简单的功能,没有任何循环。我想杀死它所使用的子线程和免费资源,只要我想要。我搜索了它,我发现inturrupt()function.my线程是:
public class childThread implements Runnable{
public void run() {
firstFunction();
secondFunction();
}
}
主线程有以下代码从上面的线程开始:
Thread tChild;
tChild = new Thread(new childThread(), "Child Thread");
tChild.start();
我的run()函数正在调用这样的函数。我如何使用inturrupt()?请告诉我任何其他杀死子线程和释放其资源的方法。谢谢。
答案 0 :(得分:4)
通过线程的合作,您可以使用它支持的任何方法来停止该线程。如果没有线程的合作,就没有理智的方法来阻止它。例如,考虑线程是否持有锁并将共享资源置于无效状态。如果没有合作,你怎么能阻止那个线程?
您有两种选择:
对线程进行编码,以便它们不会执行您不希望它们执行的工作。对它们进行编码,以便在没有工作要做时终止自己。这样,他们就不需要其他一些线程从外面“伸手”了。
对线程进行编码,以便他们提供一些方法告诉他们应该终止,然后他们干净地终止。
但那些是你的选择 - 它无法通过魔法发挥作用。
想想一个像姐姐借车一样的工作。如果你需要回车,你需要你妹妹的合作来取回它。你可以安排,以便她在你需要汽车时回来,或者你可以安排,以便你在需要汽车时告诉她然后她回来。但你不能改变这样一个事实,即她必须知道如何把车带回来或者它不会回来。
线程操纵进程资源并将它们置于无效状态。他们必须在终止之前修复东西,否则进程上下文将会损坏。
答案 1 :(得分:2)
因为你没有任何循环,所以检查Thread.interrupted()值,并假设你的firstFunction(); secondFunction();,做一个繁重的工作,你将不得不检查函数firstFunction()中的适当点; secondFunction();条件Thread.interrupted(),如果为true则完成方法。我知道你没有循环,但从概念上讲会是这样的,
Runnable runnable = new Runnable() {
private int counter;
public void run() {
while(true){
System.out.println(">> Executing " + counter++);
if(Thread.interrupted()){
break;
}
}
}
};
Thread thread = new Thread(runnable);
thread.start();
Thread.sleep(10 * 1000);
thread.interrupt();
答案 2 :(得分:0)
您的子线程需要定期检查Thread.interrupted()
,如果返回true则退出。
您的代码是否有循环并不重要。您只需在代码执行路径中选择各种点,以查看是否需要取消。
答案 3 :(得分:0)
只需在Child对象上调用中断,它就会中断你的子线程
Thread tChild;
tChild = new Thread(new childThread(), "Child Thread");
tChild.start();
//...
tChild.interrupt();
答案 4 :(得分:-1)
使用try catch环绕代码。 然后出现Catch for InterruptedException。如果有循环,则将catch语句放在循环外/如果catch在内部则中断循环。
Runnable runnable = new Runnable() {
public void run() {
try {
while(true) {
// your code
}
}(InterruptedException e) {
// It comes out
}
}