如何实现Android 中断线程的处理
答案:2 悬赏:10 手机版
解决时间 2021-02-27 19:01
- 提问者网友:戎马万世
- 2021-02-27 08:15
如何实现Android 中断线程的处理
最佳答案
- 五星知识达人网友:胯下狙击手
- 2021-02-27 09:35
可以用interrupt()方法中断线程,而线程是否已经中断则用Thread.currentThread().isInterrupted()方法返回true/false判断:
1、线程start()后马上调用interrupt(),在进入run()时中断标志已经被set on;
2、在处理sleep()可能抛出的InterruptedException时,再次中断线程即可成功中断;
3、注意interrupt()方法是set on 中断标志的,interrupted()方法是判断后并清除中断标志的。
public class ThreadDemo extends Thread{
public static void main(String[] args){
try{
ThreadDemo thread = new ThreadDemo();
thread.start();
thread.sleep(100);
thread.interrupt(); //中断线程
thread.sleep(100);
thread.printStr();
thread.interrupt(); //第三次中断线程
thread.printStr();
thread.join();
}catch(InterruptedException e){
e.printStackTrace();
}
}
private void printStr(){
System.out.println("thread obj");
}
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()) {
System.out.println("thread running");
try {
Thread.sleep(100);
}catch(InterruptedException e)
{
System.out.println("InterruptedException");
Thread.currentThread().interrupt(); //再次中断线程
}
}
System.out.println("thread interrupted");
}
}
运行结果:
thread running
InterruptedException
thread interrupted
thread obj
thread obj
1、线程start()后马上调用interrupt(),在进入run()时中断标志已经被set on;
2、在处理sleep()可能抛出的InterruptedException时,再次中断线程即可成功中断;
3、注意interrupt()方法是set on 中断标志的,interrupted()方法是判断后并清除中断标志的。
public class ThreadDemo extends Thread{
public static void main(String[] args){
try{
ThreadDemo thread = new ThreadDemo();
thread.start();
thread.sleep(100);
thread.interrupt(); //中断线程
thread.sleep(100);
thread.printStr();
thread.interrupt(); //第三次中断线程
thread.printStr();
thread.join();
}catch(InterruptedException e){
e.printStackTrace();
}
}
private void printStr(){
System.out.println("thread obj");
}
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()) {
System.out.println("thread running");
try {
Thread.sleep(100);
}catch(InterruptedException e)
{
System.out.println("InterruptedException");
Thread.currentThread().interrupt(); //再次中断线程
}
}
System.out.println("thread interrupted");
}
}
运行结果:
thread running
InterruptedException
thread interrupted
thread obj
thread obj
全部回答
- 1楼网友:一叶十三刺
- 2021-02-27 10:13
如果是c/c++回调,你只要参考linux的线程指南,在线程函数中传入回调函数地址就行了。如果是要回调到java层,稍微复杂点。 首先,你需要在onload的时候,找到回调函数所在的类,用全局变量保存: jniexport jint jnicall jni_onload(javavm *vm, void *reserved) { loge("jni_onload start"); jint version; g_vm = vm; // 全局变量保存 jnienv *env; jobject cls; version = vm->getenv((void **)&env, jni_version_1_2); if (env) { g_clazz = env->findclass(class_customsurfaceview); // 全局变量保存 } loge("jni_onload finish g_clazz = 0x%x", g_clazz); return jni_version_1_2; } 在jni启动线程的时候,需要把线程挂到jvm上,不然不能访问java。你有了g_vm, g_clazz, 以及env,就可以做回调操作了。 // 线程函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 void *threadfunc(void *data) { jnienv *env = mnull; int ret = g_vm->attachcurrentthread( (jnienv **) &env, mnull); // 挂到jvm if (ret < 0) { loge("fail to attach"); return; } // todo: 在这里做你的回调操作 g_vm->detachcurrentthread(); // 从jvm卸载 return; }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯