fix: Thread.interrupt() not working
This commit is contained in:
@@ -3,6 +3,7 @@ package com.stardust.autojs.core.looper;
|
|||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
|
||||||
import com.stardust.autojs.runtime.ScriptRuntime;
|
import com.stardust.autojs.runtime.ScriptRuntime;
|
||||||
|
import com.stardust.lang.ThreadCompat;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -87,7 +88,7 @@ public class MainThreadProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean interrupted() {
|
public static boolean interrupted() {
|
||||||
return Thread.interrupted();
|
return ThreadCompat.interrupted();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInterrupted() {
|
public boolean isInterrupted() {
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ public class ScriptRuntime {
|
|||||||
|
|
||||||
public void onExit() {
|
public void onExit() {
|
||||||
//清除interrupt状态
|
//清除interrupt状态
|
||||||
Thread.interrupted();
|
// Thread.interrupted();
|
||||||
//悬浮窗需要第一时间关闭以免出现恶意脚本全屏悬浮窗屏蔽屏幕并且在exit中写死循环的问题
|
//悬浮窗需要第一时间关闭以免出现恶意脚本全屏悬浮窗屏蔽屏幕并且在exit中写死循环的问题
|
||||||
ignoresException(floaty::closeAll);
|
ignoresException(floaty::closeAll);
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package com.stardust.lang;
|
package com.stardust.lang;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -10,72 +12,58 @@ import java.util.WeakHashMap;
|
|||||||
|
|
||||||
public class ThreadCompat extends Thread {
|
public class ThreadCompat extends Thread {
|
||||||
|
|
||||||
// private static volatile WeakHashMap<Thread, Boolean> interruptStatus = new WeakHashMap<>();
|
// FIXME: 2017/12/29 是否需要用synchronizedMap?这里虽然线程不安全,但竞争很小
|
||||||
|
private static final Set<Thread> interruptedThreads = Collections.newSetFromMap(new WeakHashMap<Thread, Boolean>());
|
||||||
|
|
||||||
public ThreadCompat() {
|
public ThreadCompat() {
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init() {
|
|
||||||
// interruptStatus.put(this, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ThreadCompat(Runnable target) {
|
public ThreadCompat(Runnable target) {
|
||||||
super(target);
|
super(target);
|
||||||
init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ThreadCompat(ThreadGroup group, Runnable target) {
|
public ThreadCompat(ThreadGroup group, Runnable target) {
|
||||||
super(group, target);
|
super(group, target);
|
||||||
init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ThreadCompat(String name) {
|
public ThreadCompat(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ThreadCompat(ThreadGroup group, String name) {
|
public ThreadCompat(ThreadGroup group, String name) {
|
||||||
super(group, name);
|
super(group, name);
|
||||||
init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ThreadCompat(Runnable target, String name) {
|
public ThreadCompat(Runnable target, String name) {
|
||||||
super(target, name);
|
super(target, name);
|
||||||
init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ThreadCompat(ThreadGroup group, Runnable target, String name) {
|
public ThreadCompat(ThreadGroup group, Runnable target, String name) {
|
||||||
super(group, target, name);
|
super(group, target, name);
|
||||||
init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ThreadCompat(ThreadGroup group, Runnable target, String name, long stackSize) {
|
public ThreadCompat(ThreadGroup group, Runnable target, String name, long stackSize) {
|
||||||
super(group, target, name, stackSize);
|
super(group, target, name, stackSize);
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
super.run();
|
|
||||||
// interruptStatus.remove(this);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
// interruptStatus.remove(this);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isInterrupted() {
|
public boolean isInterrupted() {
|
||||||
//Boolean isInterrupted = interruptStatus.get(this);
|
return super.isInterrupted() || interruptedThreads.contains(this);
|
||||||
return super.isInterrupted();// || isInterrupted == null || isInterrupted;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean interrupted() {
|
||||||
|
boolean interrupted = Thread.currentThread().isInterrupted();
|
||||||
|
interruptedThreads.remove(Thread.currentThread());
|
||||||
|
Thread.interrupted();
|
||||||
|
return interrupted;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void interrupt() {
|
public void interrupt() {
|
||||||
super.interrupt();
|
super.interrupt();
|
||||||
//interruptStatus.put(this, true);
|
interruptedThreads.add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user