你了解几种创建线程的方式呢?

基于4种创建线程的方式,完成一个小案例

Posted by MasterJen on November 21, 2018

Hey Create Thread

The secret of success is constancy to purpose.–成功的秘诀在于对目标的忠实.

在开发中,多线程一直是大家讨论的话题,因此它的重要性我在此就不多说了,想要深入了解它,那么我们先从简单创建线程开始,创建线程的方式究竟有几种呢?

准确来说 有四种方式实现线程的创建

  • 继承 jdk 1.0 版本发布的 java.lang 包下的Thread 类 重写 run方法, 但是没有返回值.

  • 实现 jdk 1.0 版本发布的 java.lang 包下的Runnable 接口 ,重写run,无返回值.

  • 实现 jdk 1.5 版本发布的 java.util.concurrent 包下的 Callable 接口,重写 call 方法,与run方法不同的是,它具有泛型的返回值,并且可以抛出异常,因此,具有极大的优势

  • 通过 jdk 1.5 版本发布的 java.util.concurrent 包下的Executors工具类 得到线程池ExecutorService进而得到线程 ,然后通过提交submit方法,进行提交任务,得到一个future 类.

Thread线程的6种状态 Thread.state

NEW
至今尚未启动的线程处于这种状态. 
RUNNABLE
正在 Java 虚拟机中执行的线程处于这种状态. 
BLOCKED
受阻塞并等待某个监视器锁的线程处于这种状态. 
WAITING
无限期地等待另一个线程来执行某一特定操作的线程处于这种状态. 
TIMED_WAITING
等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态. 
TERMINATED
已退出的线程处于这种状态

举个案例,通过两个线程实现1-100的相加的和,一个线程实现1-50 的相加,另一个线程实现50-100的相加,然后主线程进行求和运算.(基于 Callable接口以及线程池完成)

  /**
   * 分为两个线程,一个进行 1-50 计算,,一个进行 50-100计算 然后主线程进行 求和
   */
  public class TestThread {
  
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            operate();
        }
  
      private static void operate() throws ExecutionException, InterruptedException {
  //          创建线程池
          ExecutorService es = Executors.newFixedThreadPool(2);
  //        创建任务  通过 callable
          Callable callable1 =  new Callable(){
              @Override
              public Integer call() throws Exception {
                  int sum = 0;
                  for (int i = 1; i <= 50; i++) {
                      sum+=i;
                  }
                  return sum;
              }
          };
          Callable callable2 =  new Callable() {
              @Override
              public Integer call() throws Exception {
                  int sum = 0;
                  for (int i = 51; i <= 100; i++) {
                      sum += i;
                  }
                  return sum;
              }
          };
  //     提交任务
          Future f1 = es.submit(callable1);
          Future f2 = es.submit(callable2);
  
  //       得到结果
          Integer result1 = (Integer) f1.get();
          Integer result2 = (Integer) f2.get();
  
  //        进行主线程waiting 等待
          es.shutdown();
  //        直到 两个线程执行完毕
          while (es.isTerminated()){
          // 主线程等待
              System.out.println("Running Execute..");
          }
          // 主线程执行
          System.out.println(result1);
          System.out.println(result2);
          System.out.println(result1 + result2);
      }
  }

以上四种方法便实现了线程的创建.