java多线程|创建线程的各种方式

  • 2019 年 11 月 7 日
  • 筆記

javaDEMO

本网站记录了最全的各种JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~ https://www.javastudy.cloud

创建线程

继承Thread类

/**   * @Author https://www.javastudy.cloud   * @CreateTime 2019/11/01   **/  public class ThreadStudy extends Thread{        /**       * 继承Thread类并且重写run方法,       * 这个方法并不常用,因为一个java类只能继承一个类       */      @Override      public void run() {          System.out.println("run in sub Thread , Thread name is "+ Thread.currentThread().getName());      }        public static void main(String[] args) {          System.out.println("run in main Thead , Thread name is "+ Thread.currentThread().getName());            ThreadStudy study = new ThreadStudy();          //注意启动线程要用 start()方法          study.start();          try {              //让主线程休眠两秒,让子线程有足够的时间运行              Thread.sleep(2000);          } catch (InterruptedException e) {              e.printStackTrace();          }        }  }

运行结果:

实现Runnable接口

这种让一个类直接实现Runnable接口显得有些笨重 实际开发中,经常会用下面匿名类的方式创建线程

/**   * @Author https://www.javastudy.cloud   * @CreateTime 2019/11/01   **/  public class ThreadStudy implements Runnable{        /**       * 实现Runnable接口,       * 这个是常用的方法,因为一个java类可以实现多个接口       */      @Override      public void run() {          System.out.println("run in sub Thread , Thread name is "+ Thread.currentThread().getName());      }        public static void main(String[] args) {          System.out.println("run in main Thead , Thread name is "+ Thread.currentThread().getName());            //要先new 一个Thread          // 然后把实现Runnable接口的类传入到Thread的构造函数中          ThreadStudy study = new ThreadStudy();          Thread thread = new Thread(study);            //注意启动线程要用 start()方法          thread.start();          try {              //让主线程休眠两秒,让子线程有足够的时间运行              Thread.sleep(2000);          } catch (InterruptedException e) {              e.printStackTrace();          }        }  }

使用匿名类来创建线程,这里使用了lambda的写法,也是实际开发中常用的写法

/**   * @Author https://www.javastudy.cloud   * @CreateTime 2019/11/01   **/  public class ThreadStudy {          public static void main(String[] args) {          System.out.println("run in main Thread , Thread name is "+ Thread.currentThread().getName());            // 不用类实现Runnable接口了, 直接这样定义,方便,省事          Runnable runnable = ()-> System.out.println("run in sub Thread, Thread name is "+Thread.currentThread().getName());          // 启动这个线程还是要用Thread来包装下,然后调用Thread.start()方法          Thread thread = new Thread(runnable);          thread.start();          try {              //让主线程休眠两秒,让子线程有足够的时间运行              Thread.sleep(2000);          } catch (InterruptedException e) {              e.printStackTrace();          }        }  }

使用线程池

/**   * @Author https://www.javastudy.cloud   * @CreateTime 2019/11/01   **/  public class ThreadStudy {          public static void main(String[] args) {          System.out.println("Run in main Thread, Thread name is "+ Thread.currentThread().getName());            //一句话就可以创建一个线程池下面这种写法线程没有上限,实际开发中不太推荐          // 开发中一般是用下行注释的方法,或者自定义线程池参数          // 常用的还有 Executors.newFixedThreadPool(10);去创建固定10个线程的池子,这个也有弊端,就是等待的队列没有上界          //          ExecutorService service = Executors.newCachedThreadPool();          // 没有返回值的处理          service.submit(()-> System.out.println("Run in sub Thread, Thread name is "+Thread.currentThread().getName()));          // 有返回值的处理,用一个Future 去接收          Future<String> submit = service.submit(() -> "Run in sub Thread with return , Thread name is " + Thread.currentThread().getName());            //输出future里面的值          try {              System.out.println(submit.get());          } catch (InterruptedException e) {              e.printStackTrace();          } catch (ExecutionException e) {              e.printStackTrace();          }        }  }

运行结果: