我刚开始使用线程。我编写了一个主类,它设置并启动 100 个线程,等待 5 秒然后中断它们(至少我认为它是这样做的):
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
Thread-2:0
Thread-1:1
Thread-3:0
[...]
时间到了 - 终止线程...
......Thread-1:60
线程-1:61
...Thread-1:62
Thread-2:55
..全部完成。
[即使在这里,线程的输出有时也会继续 - 在 join() 之后]
那时我并不完全理解可以为单个线程分配足够的处理器时间来运行几次——我预计在主线程有机会中断它之前最多再运行一次。
但是,虽然我现在看到在主线程有机会终止(即中断)它之前执行一段时间(长时间)绝对没问题,但我仍然想知道:是否有一种简单的方法来中断所有子线程是否及时从主线程?(通过线程的构造函数设置“生存时间”,然后在 Walker 类中对其进行测试不是我想要的。)
另外:是否有可能执行最后一个打印语句,然后查看各个线程的一些输出 - 在所有线程都加入()之后?(也许我在其他地方有一个小故障;实际的代码有点复杂......)