• Java多线程编程(一)


    1、Java创建多线程的方法一:(1)实现Runnable接口并实现其中的run()方法;(2)将Runable对象提交给一个Thread构造器,调用start()方法。

    【程序实例】单线程

     1 public class LiftOff implements Runnable {
     2 
     3     protected int countDown = 10;
     4 
     5     private static int taskCount = 0;
     6 
     7     private final int id = taskCount++;
     8 
     9     public LiftOff() {
    10     }
    11 
    12     public LiftOff(int countDown) {
    13         this.countDown = countDown;
    14     }
    15 
    16     public String status() {
    17         return "#" + id + "(" + (countDown > 0 ? countDown : "LiftOff!") + "),";
    18     }
    19 
    20     @Override
    21     public void run() {
    22         while (countDown-- > 0) {
    23             System.out.print(status());
    24             Thread.yield();
    25         }
    26     }
    27 
    28 }
    1 public class Main {
    2     
    3     public static void main(String[] args){
    4         Thread thread = new Thread(new LiftOff());
    5         thread.start();
    6         System.out.println("Waiting for LiftOff");
    7     }
    8 
    9 }

    【运行结果】

    【结果分析】

     主函数中,主线程(main线程)只创建了一个线程,可以看到输出结果是有序的、可控。此外,可以看出main线程并不会等待创建的线程。

    【程序实例2】多线程

    1 public class Main {
    2 
    3     public static void main(String[] args) {
    4         for (int i = 0; i < 5; i++)
    5             new Thread(new LiftOff()).start();
    6         System.out.println("Waiting for LiftOff");
    7     }
    8 
    9 }

    【运行结果】

    【结果分析】

    此时主线程main线程创建并执行了5个线程,各个线程间是独立运行,输出的结果不可控。

    2、执行器Executor

    Java SE5的java.util.concurrent包中的执行器(Executor)将为你管理Thread对象,从而简化了并发编程。Executor 在客户端和执行任务之间提供了一个间接层,Executor代替客户端执行任务。Executor允许你管理异步任务的执行,而无须显式地管理线程的生命周期。Executor在Java SE5/6中时启动任务的优选方法。Executor引入了一些功能类来管理和使用线程Thread,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。

    【程序实例3】不固定大小线程池

     1 public class Main {
     2 
     3     public static void main(String[] args) {
     4         ExecutorService exec = Executors.newCachedThreadPool();
     5         for(int i=0;i<5;i++)
     6             exec.execute(new LiftOff());
     7         exec.shutdown();
     8     }
     9 
    10 }

    【程序实例4】固定大小线程池

     1 public class Main {
     2 
     3     public static void main(String[] args) {
     4         ExecutorService exec = Executors.newFixedThreadPool(5);
     5         for (int i = 0; i < 5; i++)
     6             exec.execute(new LiftOff());
     7         exec.shutdown();
     8     }
     9 
    10 }

    【程序分析】

    实例3中,会根据实际的需要(5个线程)在线程池中创建相应数目的线程;实例4中,在一开始就固定了线程池的大小(5个),如果线程池中的线程的数目小于需求,则需要等待其它线程执行完后,复用线程,如实例5所示。

    【程序实例5】

     1 public class Main {
     2 
     3     public static void main(String[] args) {
     4         ExecutorService exec = Executors.newFixedThreadPool(3);
     5         for (int i = 0; i < 5; i++)
     6             exec.execute(new LiftOff());
     7         exec.shutdown();
     8     }
     9 
    10 }

    【运行结果】

    1 #1(9),#0(9),#2(9),#0(8),#2(8),#1(8),#2(7),#0(7),#0(6),#0(5),#0(4),#1(7),#2(6),#0(3),#2(5),#1(6),#1(5),#1(4),#2(4),#2(3),#0(2),#2(2),#2(1),#1(3),#1(2),#1(1),#2(LiftOff!),#0(1),#0(LiftOff!),#3(9),#3(8),#1(LiftOff!),#3(7),#3(6),#4(9),#4(8),#4(7),#3(5),#4(6),#4(5),#4(4),#3(4),#3(3),#3(2),#4(3),#4(2),#3(1),#3(LiftOff!),#4(1),#4(LiftOff!),

    【结果分析】

    可以看出,最新运行的有3个线程(#0,#1,#2),只有当3个线程都运行完毕之后,才开始运行线程#3和#4。

    【程序实例6】单线程

     1 public class Main {
     2 
     3     public static void main(String[] args) {
     4         ExecutorService exec = Executors.newSingleThreadExecutor();
     5         for (int i = 0; i < 5; i++)
     6             exec.execute(new LiftOff());
     7         exec.shutdown();
     8     }
     9 
    10 }

    【运行结果】

    #0(9),#0(8),#0(7),#0(6),#0(5),#0(4),#0(3),#0(2),#0(1),#0(LiftOff!),#1(9),#1(8),#1(7),#1(6),#1(5),#1(4),#1(3),#1(2),#1(1),#1(LiftOff!),#2(9),#2(8),#2(7),#2(6),#2(5),#2(4),#2(3),#2(2),#2(1),#2(LiftOff!),#3(9),#3(8),#3(7),#3(6),#3(5),#3(4),#3(3),#3(2),#3(1),#3(LiftOff!),#4(9),#4(8),#4(7),#4(6),#4(5),#4(4),#4(3),#4(2),#4(1),#4(LiftOff!),

    【结果分析】

    此时,任务只能排队,顺序执行。

  • 相关阅读:
    阶段3 2.Spring_09.JdbcTemplate的基本使用_2 JdbcTemplate的概述和入门
    阶段3 2.Spring_08.面向切面编程 AOP_10 总结和作业安排
    阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置
    阶段3 2.Spring_08.面向切面编程 AOP_8 spring中的环绕通知
    阶段3 2.Spring_08.面向切面编程 AOP_7 通用化切入点表达式
    阶段3 2.Spring_08.面向切面编程 AOP_6 四种常用通知类型
    阶段3 2.Spring_08.面向切面编程 AOP_5 切入点表达式的写法
    阶段3 2.Spring_08.面向切面编程 AOP_4 spring基于XML的AOP-配置步骤
    阶段3 2.Spring_08.面向切面编程 AOP_3 spring基于XML的AOP-编写必要的代码
    阶段3 2.Spring_08.面向切面编程 AOP_2 spring中的aop术语和细节
  • 原文地址:https://www.cnblogs.com/acode/p/5786352.html
Copyright © 2020-2023  润新知