文档章节

多线程的实现方式

火拳-艾斯
 火拳-艾斯
发布于 2018/12/14 12:50
字数 689
阅读 6
收藏 0
JDK

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

线程的生命周期是怎么样的,下面这张图我们可以看出些端倪:

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

方法一:Runnable 接口实现:

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

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

实现多线程任务的调用:

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实现:

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

方法三: 实现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);
   }
}

 

© 著作权归作者所有

共有 人打赏支持
火拳-艾斯
粉丝 0
博文 5
码字总数 3094
作品 0
海淀
私信 提问
java实现多线程两种基本方式

我们在开发当中经常会使用到多线程,这里我们来写两个小案例通过最基本的两种方式继承Thread类或实现Runnable接口来实现一个多线程。 继承Thread类 我们可以通过继承Thread类,并重写run()方...

王子城
2018/11/13
0
0
Java多线程基础篇(02)-多线程的实现

1.概要 JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后...

kukudeku
2016/09/19
41
0
JAVA多线程实现的三种方式

最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结。 1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorS...

JasonO
2016/03/08
126
0
Java 多线程学习(1)——实现多线程的两种方式Thread/Runnable

版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/huqigang,内容如有错误,欢迎留言指出,谢谢! https://blog.csdn.net/huqigang/article/details/7...

胡了了
2018/03/07
0
0
每天一个设计模式之 -- 单例模式

单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建...

时光流转
2018/05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何限制用户仅通过HTTPS方式访问OSS?

一、当前存在的问题 当前OSS支持用户使用HTTPS/HTTP协议访问Bucket。但由于HTTP存在安全漏洞。大型企业客户都要求使用HTTPS方式访问OSS,并且拒绝HTTP访问请求。 目前OSS可以通过RAM policy方...

阿里云官方博客
11分钟前
0
0
详解深度学习之经典网络架构——LeNet

一、基本简介 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。 二、LeNet网络的基本结构 LeNet5 这个网络虽...

AI女神
14分钟前
0
0
日志服务Python消费组实战(二):实时分发数据

场景目标 使用日志服务的Web-tracking、logtail(文件极简)、syslog等收集上来的日志经常存在各种各样的格式,我们需要针对特定的日志(例如topic)进行一定的分发到特定的logstore中处理和...

阿里云云栖社区
15分钟前
1
0
LVM 增加磁盘扩容

sudo parted /dev/sdeparted> mklabel gptparted> mkpart primary lvm ext4 %0 %100parted> printsudo lvmlvm> pvcreate /dev/sde1lvm> vgextend vg-data /dev/sde1lvm> lve......

仪山湖
18分钟前
0
0
Linux挂载本地iso镜像,不联网使用yum命令

上传iso镜像文件到/mnt 目录下 在/mnt目录下创建Server目录 mkdir Server 备份 /etc/yum.repos.d/目录下的repo文件 cd /etc/yum.repos.dmkdir repobakmv *.repo repobak/ 挂载本地iso文件...

AustinYe
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部