代码一:定义任务(倒计时)
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");
}
}
- 不能依赖于任何线程行为的一致性。最好的方式是在使用线程时尽可能的保守
代码四:使用执行器Executor
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
代码五:有限线程集的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);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。