Как отменить все потоки через 5 секунд из главного потока через разделяемую память (разделяемую переменную)?
У меня есть программа:
public class Task3 {
public static void main(String[] args) throws InterruptedException {
ExecutorService poolOfThreads = Executors.newFixedThreadPool(10);
long start = System.currentTimeMillis();
for (int i = 1; i <= 10; i++) {
int finalI = i;
poolOfThreads.submit(new Task2Thread(i, start));
}
poolOfThreads.shutdown();
Thread.sleep(5000);
poolOfThreads.awaitTermination(1, TimeUnit.DAYS);
}
}
public class Task3Thread implements Runnable{
volatile boolean running = true;
private int id;
private long time;
public Task3Thread(int id, long time) {
this.id = id;
this.time = time;
}
@Override
public void run() {
while (running) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("Thread: " + id + ", time: " + (end - time));
}
}
public void setRunning(boolean running) {
this.running = running;
}
}
Эти классы вывводят порождают 10 потоков, каждый из которых каждую секунду выводит в консоль свой номер и время, прошедшее с момента его запуска в секундах.
Теперь мне нужно отменить все потоки через 5 секунд из главного потока через разделяемую память (разделяемую переменную).
А так же мне нужно отменить все потоки через 5 секунд из главного потока через прерывание потоков.
Подскажите пожалуйста как это сделать?
Ответы (1 шт):
Автор решения: Aziz Umarov
→ Ссылка
Как-то так.
public class Task3Thread implements Runnable {
volatile boolean running = true;
private int id;
private long time;
public Task3Thread(int id, long time) {
this.id = id;
this.time = time;
}
@Override
public void run() {
while (running) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Thread: " + id + " - Interrupted");
break;
}
long end = System.currentTimeMillis();
System.out.println("Thread: " + id + ", time: " + (end - time));
}
}
public void setRunning(boolean running) {
this.running = running;
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class test {
public static void main(String[] args) throws InterruptedException {
ExecutorService poolOfThreads = Executors.newFixedThreadPool(10);
long start = System.currentTimeMillis();
List<Future> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
list.add(poolOfThreads.submit(new Task3Thread(i, start)));
}
Thread.sleep(5000);
for (Future<?> item : list) {
item.cancel(true);
}
poolOfThreads.shutdown();
poolOfThreads.awaitTermination(1, TimeUnit.DAYS);
}
}