Я только начал с резьбы. Я написал главный класс, который устанавливает и запускает 100 потоков, ждет 5 секунд, а затем прерывает их (по крайней мере, это то, что я думал, что это сделало):Как (надежно) прерывать потоки из основного потока через определенное количество времени в Java?
public static void main(String[] args) {
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 100; i++) {
Thread t = new Thread(new Walker());
threads.add(t);
}
System.out.println("Starting threads...");
for (Thread thread : threads) {
thread.start();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// don't do anything
}
System.out.println("Time's up - Terminating threads...");
for (Thread t : threads) {
t.interrupt();
System.out.print(".");
}
for (Thread t : threads) {
try {
t.join(10);
} catch (InterruptedException e) {
// don't do anything
}
}
System.out.println("");
System.out.println("All done.");
}
Нить выглядела немного так:
public class Walker implements Runnable {
public void run() {
for (int i = 0;; i++) {
//do some complicated stuff that takes some time
System.out.println(Thread.currentThread().getName() + ":" + i);
if (Thread.interrupted()) {
break;
}
}
}
}
Теперь я получил то, что основной поток начал прерывать потоки, но некоторые подпотоки продолжали работать несколько раз (т.е. итерации цикла) до завершения, например
Стартовые темы ...
Thread-1: 0
резьбы 2: 0
Thread-1: 1
резьбы 3: 0
[...]
Время вверх - Концевые нити ...
...... тема-1: 60
резьбы 1: 61
... тема-1: 62
резьбы 2: 55
..All сделано.
[выход из нитей иногда продолжались даже здесь - после того, как присоединиться()]
В то время я не в полной мере понять, что один поток может быть выделено достаточное количество процессорного времени, чтобы запустить несколько раз - я ожидал максимум один дополнительный прогон перед тем, как основной поток имел возможность прервать его.
Но, хотя теперь я вижу, что это нормально для потока, выполняемого в течение некоторого (длинного) времени, прежде чем основной поток получит шанс прекратить (то есть прервать) его, мне все еще интересно: есть ли easy Способ прерывания всех дочерних потоков своевременно из основного потока? (Установка «времени на живое» через конструктор потока, а затем тестирование внутри класса Walker для него не то, что я хочу.)
Также: возможно ли выполнить последний оператор печати, а затем просмотреть некоторые результаты из отдельные потоки - после того, как все потоки присоединились() ed? (Может быть, у меня есть глюк где-то еще, фактический код является немного более сложным ...)
Спасибо, я буду идти на это. :) – Christian