面试复习必备之:多线程

1.线程与进程

进程:正在执行的应用程序

线程:进程的执行单元,执行路径

单线程:一个应用程序只有一条执行路径

多进程的意义:提高CPU的使用率

多线程的意义:提高应用程序的使用率


2.线程的生命周期

A:新建   B:就绪   C:运行   D:阻塞   E:死亡

线程的控制(常见方法)

A:休眠线程:public static void sleep(long millis)

B:加入线程:public final void join()

C:礼让线程:public static void yield()

D:后台线程:public final void setDaemon(boolean on)

E:终止线程:public final void stop()

                public void interrupt()

线程的调度和优先级问题

A:线程的调度

a:分时调度

b:抢占式调度 (Java采用的是该调度方式)

B:获取和设置线程优先级

a:默认是5

b:范围是1-10

 

waitsleep区别: 分析这两个方法:从执行权和锁上来分析: 

wait:可以指定时间也可以不指定时间。不指定时间,只能由对应的notify或者

notifyAll来唤醒。 

sleep:必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)

 wait:线程会释放执行权,而且线程会释放锁。 

Sleep:线程会释放执行权,但不是不释放锁。  

3.线程的创建方式

创建线程的第一种方式:继承Thread ,由子类复写run方法。 


步骤: 

1,定义类继承Thread类; 

2,目的是复写run方法,将要让线程运行的代码都存储到run方法中; 

3,通过创建Thread类的子类对象,创建线程 对象; 

4,调用线程的start方法,开启线程,并执行run方法。 

线程状态: 

新建:start() 

运行:具备执行资格,同时具备执行权; 

冻结:sleep(time),wait()notify()唤醒;线程释放了执行权,同时释放执行资格; 

临时阻塞状态:线程具备cpu的执行资格,没有cpu的执行权; 

消亡:stop() 

 

创建线程的第二种方式:实现一个接口Runnable


 步骤: 

1,定义类实现Runnable接口。 

2,覆盖接口中的run方法(用于封装线程要运行的代码)。 

3,通过Thread类创建线程对象; 

4,将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数。 

为什么要传递呢?因为要让线程对象明确要运行的run方法所属的对象。 

5,调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run方法。 


3.多线程安全问题


多线程安全问题的原因: 

一个线程在执行多条语句时,并运算同一个数据时,在执行过程中,其他线程参与进来,并操作了这个数据。导致到了错误数据的产生。

 

 涉及到两个因素: 

1,多个线程在操作共享数据。 

2,有多条语句对共享数据进行运算。 

原因:这多条语句,在某一个时刻被一个线程执行时,还没有执行完,就被其他线程执行了。 

 

解决安全问题的原理: 

只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行就可以解决这个问题。

 

同步解决线程安全问题

A:同步代码块

synchronized(对象) {

需要被同步的代码;

}

这里的锁对象可以是任意对象。

B:同步方法

把同步加在方法上。

这里的锁对象是this

C:静态同步方法

把同步加在方法上。

这里的锁对象是当前类的字节码文件对象(反射再讲字节码文件对象)


3.线程池

程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,

尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。

线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。

JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池

JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法:

public static ExecutorService newCachedThreadPool()

public static ExecutorService newFixedThreadPool(int nThreads)

public static ExecutorService newSingleThreadExecutor()

这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法

Future<?> submit(Runnable task)

<T> Future<T> submit(Callable<T> task)





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值