成都千锋Java编程入门之多线程编程
千锋教育老师又来发福利啦,这次是多线程编程。
一、进程与线程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的至小单元。线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
二、同步与异步
对于一次方法的调用来说,同步方法调用一旦开始,就必须等待该方法的调用返回,后续的方法才可以继续执行;异步的话,方法调用一旦开始,就可以立即返回,调用者可以执行后续的方法,这里的异步方法通常会在另一个线程里真实的执行,而不会妨碍当前线程的执行。
三、并行与并发
并发和并行是两个相对容易比较混淆的概念。他都可以表示在同一时间范围内有两个或多个任务同时在执行,但其在任务调度的时候还是有区别的,首先看下图:
并发任务执行过程:
从上图中可以看到,两个任务在执行的时候,并发是没有时间上的重叠的,两个任务是交替执行的,由于切换的非常快,对于外界调用者来说相当于同一时刻多个任务一起执行了;而并行可以看到时间上是由重叠的,也就是说并行才是真正意义上的同一时刻可以有多个任务同时执行。
四、Java实现多线程方式
(1)继承Thread,重写run()方法
输出结果:
另外,要明白启动线程的是 start()方法而不是run()方法,如果用run()方法,那么他就是一个普通的方法执行了。
(2)实现 Runable 接口
这里Thread和Runnable的关系是这样的:
Thread类本身实现了Runnable接口,并且持有run方法,但Thread类的run方法主体是空的,Thread类的run方法通常是由子类的run方法重写。
(3)实现 Callable 接口处理带有返回值的线程
从Java 1.5开始,就提供了Callable和Future,依靠它们可以在任务执行完毕之后得到任务执行结果。
五、JDK自带线程池
可以看到我们在上边的Callable例子中使用了JDK线程池。Java由Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程至大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用的工作线程来执行任务,确保所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
当然,多线程编程只是Java编程入门知识的一部分,全部内容请来千锋教育。
千锋教育:http://www.mobile***/
千锋成都校区:http://cd.mobile***/
成都校区地址:成都市武侯区科华北路62号力宝大厦N(北楼)18楼
培训咨询专线:028-83178771
咨 询 Q Q : 1660794050
面授课程:全栈Web开发+培训、全链路设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+Python运维培训、全栈软件测试培训、Android培训、iOS培训、好程序员
一、进程与线程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的至小单元。线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
二、同步与异步
对于一次方法的调用来说,同步方法调用一旦开始,就必须等待该方法的调用返回,后续的方法才可以继续执行;异步的话,方法调用一旦开始,就可以立即返回,调用者可以执行后续的方法,这里的异步方法通常会在另一个线程里真实的执行,而不会妨碍当前线程的执行。
三、并行与并发
并发和并行是两个相对容易比较混淆的概念。他都可以表示在同一时间范围内有两个或多个任务同时在执行,但其在任务调度的时候还是有区别的,首先看下图:
并发任务执行过程:
从上图中可以看到,两个任务在执行的时候,并发是没有时间上的重叠的,两个任务是交替执行的,由于切换的非常快,对于外界调用者来说相当于同一时刻多个任务一起执行了;而并行可以看到时间上是由重叠的,也就是说并行才是真正意义上的同一时刻可以有多个任务同时执行。
四、Java实现多线程方式
(1)继承Thread,重写run()方法
输出结果:
另外,要明白启动线程的是 start()方法而不是run()方法,如果用run()方法,那么他就是一个普通的方法执行了。
(2)实现 Runable 接口
这里Thread和Runnable的关系是这样的:
Thread类本身实现了Runnable接口,并且持有run方法,但Thread类的run方法主体是空的,Thread类的run方法通常是由子类的run方法重写。
(3)实现 Callable 接口处理带有返回值的线程
从Java 1.5开始,就提供了Callable和Future,依靠它们可以在任务执行完毕之后得到任务执行结果。
五、JDK自带线程池
可以看到我们在上边的Callable例子中使用了JDK线程池。Java由Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程至大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用的工作线程来执行任务,确保所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
当然,多线程编程只是Java编程入门知识的一部分,全部内容请来千锋教育。
千锋教育:http://www.mobile***/
千锋成都校区:http://cd.mobile***/
成都校区地址:成都市武侯区科华北路62号力宝大厦N(北楼)18楼
培训咨询专线:028-83178771
咨 询 Q Q : 1660794050
面授课程:全栈Web开发+培训、全链路设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+Python运维培训、全栈软件测试培训、Android培训、iOS培训、好程序员