Редактировать:
Чтобы проверить эту проблему вне среды Android, я создал приложение Java, которое создает ExecutorService
, предоставляет задачу AttackScript
(идентичный класс)и затем завершается.
Этот работает на 100% как ожидалось , поток прерывается и задача останавливается.
Вам даже не нужно отменять задачу с помощью Future.cancel(true)
.ExecutorService.shutdownNow()
делает работу.Есть ли что-то в Android Service
, которое каким-то образом портится с пулом потоков?
Код, который работает как указано:
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()");
}
}
Исходное сообщение:
У меня есть Android Service
, где он содержит поле ExecutorService
, отвечающее за выполнение некоторых задач.
Задачи являются объектами класса AttackScript
.Я кэширую ссылки Future
в Map<String,Future>
, называемых задачами, так что я смогу отменить их позже.
Future future = executor.submit(new AttackScript(attack.getWebsite()));
tasks.put(attack.getPushId(), future);
В Service
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();
}
}
Наконец вот AttackScript класс:
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);
}
}
}
Странная часть в том, что редко, как 1 из 10, задачи прерываются и выполнение AttackScript
останавливается.Но остальные 9 задач не были прерваны, продолжая openStreams () на URL
с.