编辑:
为了在Android环境之外测试这个问题,我创建了一个Java应用程序,它创建了一个
ExecutorService
,提供的任务
AttackScript
(相同的类),然后终止。
这个
100%按预期工作
,线程中断,任务停止。
你甚至不必取消一个任务
Future.cancel(true)
.
ExecutorService.shutdownNow()
做这项工作。安卓有什么东西吗
Service
不知怎么搞砸了线程池?
可作为expaccepted使用的代码:
public static void main(String[] args) {
AttackScript script = new AttackScript("http://ninjaflex.com/");
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(script);
executor.submit(script);
executor.submit(script);
executor.submit(script);
sleep(1300);
// Automatically interrupts threads in the pool.
executor.shutdownNow();
}
private static void sleep(long timeMilli){
try {
Thread.sleep(timeMilli);
} catch(Exception e) {
System.out.println("Error sleep()");
}
}
原始职位:
我有安卓系统
服务
其中包括
执行服务
字段,负责运行某些任务。
任务是
攻击脚本
班级。我缓存
Future
A中的引用
Map<String,Future>
,调用了任务,以便以后可以取消它们。
Future future = executor.submit(new AttackScript(attack.getWebsite()));
tasks.put(attack.getPushId(), future);
在
服务
的
onDestroy()
(当用户按下通知按钮时调用)我是
取消所有任务
private void cancelAllTasks() {
for (Map.Entry<String, Future> futureEntry : tasks.entrySet()) {
futureEntry.getValue().cancel(true);
}
}
然后
关闭执行器
:
private void shutdownThreadPool() {
// https://www.baeldung.com/java-executor-service-tutorial
executor.shutdown();
try {
if (executor.awaitTermination(800, TimeUnit.MILLISECONDS))
executor.shutdownNow();
} catch (InterruptedException e) {
executor.shutdownNow();
}
}
最后这里是
攻击脚本
班级:
public class AttackScript implements Runnable {
private static final String TAG = "AttackScript";
private URL url;
public AttackScript(String website) {
initializeUrl(website);
}
private void initializeUrl(String website) {
try {
url = new URL(website);
} catch (MalformedURLException e) {
Log.e(TAG, "Wrong url?", e);
}
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
readUrl();
}
Log.d(TAG, "Stopped requesting from " + url + " server.");
}
private void readUrl() {
InputStream in = null;
try {
in = url.openStream();
} catch (IOException e) {
Log.e(TAG, "openStream() error.", e);
} finally {
closeInputStream(in);
}
}
private void closeInputStream(InputStream in) {
try {
in.close();
Log.d(TAG, "InputStream closed for " + url);
} catch (IOException e) {
Log.e(TAG, "Error while closing the input stream.", e);
}
}
}
奇怪的是,很少会像10个任务中的1个那样中断任务,
攻击脚本
的执行停止。但其他9个任务没有中断,继续在上执行openstreams()。
URL
S.