代码一:定义任务(倒计时)

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);

贤魚
20 声望1 粉丝

如露亦如电


« 上一篇
自定义管道
下一篇 »
阅读记录