public class LiftOff implements Runnable {
protected int countDown = 10;
private static int taskCount=0;
private final int id = taskCount++;
public LiftOff(int countDown) {this.countDown = countDown;}
public LiftOff() {}
public String status(){return "#" + id + "(" +(countDown>0?countDown:"Liftoff") +')';
}
public void run(){while (countDown-- > 0) {System.out.println(status());
Thread.yield();}
}
public static void main(String[] args) {new LiftOff().run();}
}
- Thread.yield() 的调用是对线程调度器的一种倡议,“我曾经执行完生命周期外面最重要的局部了,能够把处理器切换给其余工作”
- taskCount 用于区别线程
public static void main(String[] args) {Thread thread = new Thread(new LiftOff());
thread.start();
System.out.println("Waiting for LiftOff");
}
- 任何线程都能够启动另一个线程
- 也能够调用 thread.run(),但仿佛并没有启动新的线程
public static void main(String[] args) {for (int i = 0; i < 5; i++) {new Thread(new LiftOff()).start();
System.out.println("Waiting for LiftOff");
}
}
- 不能依赖于任何线程行为的一致性。最好的形式是在应用线程时尽可能的激进
public static void main(String[] args) {ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {exec.execute(new LiftOff());
}
exec.shutdown();}
- Executor 容许你治理异步工作的执行,而无需显示地治理线程的申明周期 (?)
- ExecutorServeice 是具备生命周期的 Executor, 它晓得如何构建适当的上下文来执行 Runnable 对象
- 单个 Executor 常被用来创立和管理系统中所有的工作
- shutdown() 办法的调用能够避免新工作被提交给这个 executor
public static void main(String[] args) {ExecutorService exec = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {exec.execute(new LiftOff());
}
exec.shutdown();}
- 应用 FixedThreadPool 能够一次性事后执行代价昂扬的线程调配,节俭创立线程的开销
- 在任何线程池中,现有线程在可能的状况下,都会被主动复用?
- CachedThreadPool 通常会创立与所需数量雷同的线程,而后在它回收旧线程时进行创立新线程?,因而它是 Executor 的首选,呈现问题才须要切换到 FixedThreadPool
- 这几个线程池的实质是返回了一个不同参数的 newThreadPoolExecutor(args);