面试题——多线程

1.什么是线程?

线程是操作系统能够进行运算调度的最小单位。

2、线程和进程有什么区别?优缺点?

(1)根本区别:进程是操作系统资源分配的基本单位,线程是任务调度和执行的基本单位
(2)进程是独立的
(3)一个程序至少有一个进程,一个进程至少有一个线程
(4)线程的划分尺度小于进程,使得多线程程序的并发性高
优缺点:线程执行开销小,但不利于资源的管理和保护,进程正好相反

3、什么是线程阻塞?

线程阻塞通常是指一个线程在执行过程中暂停,以等待某个条件的触发

4、什么是线程死锁?

死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两个对象所持有的,导致两个对象无法完成操作,且所持资源无法释放。

5、Java如何实现线程?

(1)继承(extends)Thread类覆盖run()方法即可,这中方法的缺点是,一个Java类只能继承一个父类
(2)实现Runnable接口,实现run()方法即可(最常用的方式),可满足Java多继承
(3)implements Callable,实现call()方法即可

6、Thread类中start()和run()方法的区别?

start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法效果不一样,调用run()方法时,只会是在原来的线程中调用,没有启动新的线程,start()方法会启动新的线程

7、线程的5种状态?

五种状态:创建、就绪、运行、阻塞和死亡

8、Java中Runnable和Callable有什么不同?

主要区别:Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能

9、Java中什么是竞态条件?

当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。在临界区使用适当的同步就可以避免竞态条件。
临界区有两种实现方法:(1)一种是用snychronized(2)用lock显示锁实现

10、如何在两个线程间共享数据?

通过共享对象来实现这个目的

11、Java种notify和notifyAll有什么区别?

(1)notify()不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地
(2)notifyAll()唤醒所有线程并允许他们之间争夺锁,确保了至少有一个线程能继续运行

12、什么是线程池?

线程池是一种多线程的处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务

13、Java种常用的三种线程池?

(1)FixedThreadPool:这是一个线程数固定的线程池,当这个线程池被创建的时候,池里的线程数就已经固定了
(2)SingleThreadExecutor:这是一个线程数量为1的线程池,所有提交的这个线程池的任务都会按照提交的先后顺序排队执行
(3)CachedThreadPool:缓存有关的线程池

14、如何避免线程死锁?

线程死锁必须满足的四个条件:
(1)互斥条件:一个资源每次只能被一个进程使用
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
(3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
避免线程死锁最简单的方法就是阻止循环等待条件

15、有三个线程T1,T2,T3,怎么确保它们按顺序执行?

使用线程类种的join()方法,在一个线程中启动另一个线程,另外一个线程完成该线程继续执行

16、java多线程中调用wait()和sleep()方法有什么不同?

Java程序中wait和sleep都会造成某种形式的暂停,他们可以满足不同的需求。
(1)wait()方法用于线程间的通信,如果等待条件为真且其他线程被唤醒时它会释放锁
(2)sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值