关于java:Java线程一

代码一:定义工作(倒计时)

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理