java复习

线程池

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线程具有普通优先级。

线程的生命周期:

java复习_第1张图片

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的状态

 

你可能感兴趣的:(java,jvm,算法)