线程池
1.创建多线程的方式三:实现Callable (jdk5.新增的)
与之前的方式的对比:与Runnable方式的对比的好处
> calL()可以有返回值,更灵活
>call)可以使用throws的方式处理异常,更灵活v
> Callable使用了泛型参数,可以指明具体的calL()的返回值类型,更灵活
有缺点吗?如果在主线程中需要获取分线程caLL0)的返回值,则此时的主线程是阻塞状态的
2.创建多线程的方式四:使用线程池
此方式的好处:
>提高了程序执行的效率。(因为线程已经提前创建好了)
>提高了资源的复用率。(因为执行完的线程并未销毁,而是可以继续执行其它的任务)
>可以设置相关的参数,对线程池中的线程的使用进行管理
复习:栈管运行,堆管存储。
一、
1.几个概念
程序(program):为完成特定任务,用某种语言编写的、一组指令的集合。即指一段静态的代码.
进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。程序是静态的,进程是动态的。
进程作为操作系统调度和分配资源的最小单位。
线程(thread)进程可进一步细化为线程,是程序内部的一条执行路径线程作为CPU调度和执行的最小单位
2.线程调度策略
分时调度:所有线程轮流使用 CPU 的使用权,并且平均分配每个线程占用 CPU 的时间。
抢占式调度:让优先级高”的线程以“较大的概率优先使用CPU。如果线程的优先级相同,那么会随机选择一个(线程随机)
二、如何创建多线程(重点)
。方式1: 继承Thread类
。方式2:实现Runnable接口
。方式3: 实现Callable接口 (dk5.0新增)
。方式4: 使用线程池 (dk5.0新增)
三、Thread类的常用方法、线程的生命周期
熟悉常用的构造器和方法:
1.线程中的构造器
public Thread() :分配一个新的线程对象。
public Thread(String name) :分配一个指定名字的新的线程对象。
public Thread(Runnable target) :指定创建线程的目标对象,它实现了Runnable接口中的run方法public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字
2.线程中的常用方法:
>start():@启动线程 @调用线程的run()
>run():将线程要执行的操作,声明在run()中。
>currentThread():获取当前执行代码对应的线程y
>getName(): 获取线程名
>setName(): 设置线程名
>sleep(long millis):静态方法,调用时,可以使得当前线程睡眠指定的毫秒数y
>yield():静态方法,一旦执行此方法,就释放CPU的执行权
>join():在线程a中通过线程b调用9join(),意味着线程a进入阻塞状态,直到线程b执行结束,线程a才结束阻塞状态,继续执行。
>isAlive():判断当前线程是否存活
3.线程的优先级:
getPriority():获取线程的优先级
setPriority():设置线程的优先级。范围[1,10]
Thread类内部声明的三个常量:
-MAX_PRIORITY (1):最高优先级
-MIN_PRIORITY (1):最低优先级
-NORM_PRIORITY (5):普通优先级,默认情况下main线程具有普通优先级。
线程的生命周期:
Jdk5.0之后
4.如何解决线程安全问题(重点、难点)
>什么是线程的安全问题? 多个线程操作共享数据,就有可能出现安全问题
>如何解决线们的安全问题?有几种方式?0
-同步机制: 同步代码块 同步方法
重点关注两个事:共享数据及操作共享数据的代码;同步监视器(保证唯一性)
在实现Runnable接口的方式中,同步监视器可以考虑使用: this。
在继承Thread类的方式中,同步监视器要慎用this,可以考虑使用:当前类.class。
非静态的同步方法,默认同步监视器是this
静态的同步方法,默认同步监视器是当前类本身。
-jdk5.0新增: Lock接口及其实现类 (保证多个线程共用同一个Lock的实例)
5.同步机制相关的问题
>懒汉式的线程安全的写法
>同步机制会带来的问题: 死锁
-死锁产生的条件及规避方式
6.线程间的通信
在同步机制下,考虑线程间的通信
。wait0、notify0、notifyAll0 都需要使用在同步代码块或同步方法中。
高频题:wait()/和sleep()的区别
二、企业真题
2.1 线程概述
1.什么是线程(*云网络)
进程:运行中的程序
线程:运行中的进程的一条或多条执行路径。
2.线程和进程有什么区别(*团、腾*、*云网络、神**岳、言*有物、直*科技)
进程:运行中的程序
线程:运行中的进程的一条或多条执行路径。
3.多线程使用场景(嘉*医疗)
手机app应用的图片下载
迅雷的下载
Tomcat服务器上wed应用,多个客户端发起请求,Tomcat针对多个请求开辟多个线程处理
2.2 如何实现多线程
方式1: 继承Thread类
。方式2:实现Runnable接口
。方式3: 实现Callable接口 (dk5.0新增)
。方式4: 使用线程池 (dk5.0新增)
1.如何在Java中出实现多线程?(阿*校招、当*置业、鸿*网络、奥*医药、*科软、慧*、上海驿软件、海*科)
类似问题:
>创建多线程用Runnable还是Thread(北京中*瑞飞)
>多线程有几种实现方法,都是什么? (锐*(上海)企业管理咨询)
方式1: 继承Thread类
。方式2:实现Runnable接口
。方式3: 实现Callable接口 (dk5.0新增)
。方式4: 使用线程池 (dk5.0新增)
2.Thread类中的start()和run()有什么区别? (北京中油**、爱*信、神*泰岳、直*科技,*软国际,上海*学网络)
start0: 开启线程 调用线程的run0
3.启动一个线程是用run()还是start()? (*度)I
start()
4.Java中Runnable和Callable有什么不同?(平*金服、银*数据、好*在、亿*征信、花儿**网络)
与之前的方式的对比:与Runnable方式的对比的好处
cal1()可以有返回值,更灵活
>cal1()可以使用throws的方式处理异常,更灵活
>Callable使用了泛型参数,可以指明具体的cal1()的返回值类型,更灵活
有缺点吗?如果在主线程中需要获取分线程ca11()的返回值,则此时的主线程是阻塞状态的。
5.什么是线程池,为什么要使用它? (上海明*物联网科技)
此方式的好处:
(因为线程已经提前创建好[
提高了程序执行的效率。
提高了资源的复用率。(因为执行完的线程并未销毁,而是可以继续执行其他的任务)可以设置相关的参数,对线程池中的线程的使用进行管理
2.3 常用方法、生命周期
1.sleep()和 yield()区别? (神*泰岳)
sleep(:一旦调用,就进入“阻塞”(或TIMED_WAITING状态)
yield0:释放cpu的执行权,处在RUNNABLE的状态