Как отменить все потоки через 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);
  }
}
→ Ссылка