多线程的实现方式

多线程是指 一个程序运行时,产生或使用了不止一个线程。java

线程的生命周期是怎么样的,下面这张图咱们能够看出些端倪:多线程

这章咱们主要讨论多线程实现的方式,基础知识部分咱们能够下来再恶补。ide

方法一:Runnable 接口实现:this

继承接口,实现业务逻辑:spa

public class WorkRunnable implements Runnable {
   private String taskName;
   public WorkRunnable(String taskName) {
      this.taskName = taskName;
   }
   @Override
   public void run() {
      System.out.println("开始执行任务" + taskName);
      try {
         Thread.sleep(2000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      System.out.println(taskName + "任务执行完成");

   }
}

初始化一个线程池,来调用任务:线程

public class ThreadPool {
   private static final int                CORE_SIZE       = 8;
   private static final int                MAX_SIZE        = 12;
   private static final long               KEEP_ALIVE_TIME = 30;
   private static final int                QUEUE_SIZE      = 50000;
   private static       ThreadPoolExecutor threadPool      = new ThreadPoolExecutor(CORE_SIZE, MAX_SIZE,
         KEEP_ALIVE_TIME, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(QUEUE_SIZE),
         new ThreadPoolExecutor.AbortPolicy());
   public static ThreadPoolExecutor getThreadPool() {
      return threadPool;
   }
}

实现多线程任务的调用:code

public class RunnableClient {
   public static void main(String[] args) {
      WorkRunnable runnable1 = new WorkRunnable("taskName1");
      WorkRunnable runnable2 = new WorkRunnable("taskName2");
      ThreadPoolExecutor executor = ThreadPool.getThreadPool();
      executor.execute(runnable1);
      executor.execute(runnable2);
   }
}

方法二:继承Thread实现:blog

这种方式的实现,在我前一篇文章中已有提到,这里再也不单独讨论。继承

方法三: 实现Callable接口,这是一个带返回值的实现方式:接口

看任务定义:

public class WorkCallable implements Callable<String> {
   private String taskName;
   public WorkCallable(String taskName) {
      this.taskName = taskName;
   }
   @Override
   public String call() throws Exception {
      System.out.println(taskName + "开始执行");
      Thread.sleep(2000);
      System.out.println(taskName + "结束执行");
      return taskName;
   }
}

再来看主线程中如何调用:

public class CallableClient {
   public static void main(String[] args) throws ExecutionException, InterruptedException {
      WorkCallable task1 = new WorkCallable("task1");
      WorkCallable task2 = new WorkCallable("task2");
      FutureTask<String> task11 = new FutureTask<String>(task1);
      FutureTask<String> task22 = new FutureTask<String>(task2);
      Thread t1 =  new Thread(task11);
      Thread t2 =  new Thread(task22);
      t1.start();
      t2.start();
      System.out.println("task1的执行结果:" + task11.get());
      System.out.println("task2的执行结果:" + task22.get());
   }
}

 

执行代码,看下执行结果如何:

task1开始执行
task2开始执行
task2结束执行
task1结束执行
task1的执行结果:task1
task2的执行结果:task2

方法四:使用定时器,就是继承TimerTask 类:

翻看JDK的源码,能够看到,TimerTask 是一个实现了 Runnable 接口的抽象类,因此它跟Runnable接口的实现方式本质上是同样的。

任务实现类:

public class WorkTimer extends TimerTask {
   private String taskName;
   public WorkTimer(String taskName) {
      this.taskName = taskName;
   }
   @Override
   public void run() {
      System.out.println(taskName + "任务开始执行");
      try {
         Thread.sleep(3000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      System.out.println(taskName + "任务执行结束");
   }
}

主线程:

public class TimerClient {
   public static void main(String[] args) {
      WorkTimer task1 = new WorkTimer("task1");
      WorkTimer task2 = new WorkTimer("task2");
      Timer timer = new Timer();
      timer.schedule(task1,2000);
      timer.schedule(task2, 3000);
}
}
相关文章
相关标签/搜索