JAVA多线程常见面试问题解析

一、Java多线程有几种实现方式?

java中多线程有三种实现方式(上一篇文章中说了两种,是因为第三种确实比较少用了)。

1.继承Thread类,重写他的run方法。Thread类其自身其实也是一个实现了Runnable接口的实例,通过Thread类的start()方法启动该线程的唯一方式;

2.实现Runnable接口,然后去实现他的run()方法。使用方法是,创建一个Thread对象,然后用实现的Runnable接口的类作为Thread对象的实例化参数,然后调用此对象的start()方法;

3.实现Callable接口,重写call方法。这个接口我用的比较少,内容是从网上找的,希望大家不要喷。Callable接口与Runnable接口的功能类似,但他有以下三点是Runnable接口所没有的。

1).Callable可以在任务结束后提供一个返回值;

2).Callable中的call()方法是可以抛出异常的;

3).运行实现Callable接口的对象可以拿到一个Future对象,该对象存储的是异步计算的结果,用他作为检查计算是否完成的方法。

二、run()方法与 start()方法的区别

start()方法是实例化线程后去启动该线程,而run()方法是线程中具体的操作方法。

如果直接调用线程的run()方法,程序只会当他是一个普通的函数去执行,并没有给他开辟线程。如果要使程序为他单独开发线程,则需要调用该实例化线程的start()方法。

三、sleep()方法与wait()方法的区别

sleep()方法的作用是要求线程暂停一段时间,等到倒计时时间到达后会继续执行后面的代码,在此过程中线程并不会释放所占用的资源和锁。但是当程序调用wait()方法后,线程进入等待状态,此时线程会释放掉所占用对象的资源和锁,只有其他线程调用该线程的notify()方法,线程才会被唤醒。

sleep()方法的作用是控制线程本身,是Thread的静态方法,而wait是Object类的方法,是用于线程之间相互通信的。sleep()方法可以在线程中的任何地方使用,而wait()方法必须放在同步方法,或者同步代码块中执行。

四、synchronized、notify、wait之间的相互运用

synchronized关键字是线程中或者其他代码中用于做同步的关键字。可以加到方法上,叫做同步方法。可以加到一块代码上,叫做同步代码块。

例如:

同步方法: public synchronized void function(){}

同步代码块:synchronized(object){}

当某个资源或者对象被synchronized关键字修饰后,此时如果多个线程同时请求该资源,那么多个线程必须排队等待,必须先到的线程使用结束后其他线程才可执行。

例如:线程1和线程2两个线程在同时请求一个资源,线程1的请求先到达,执行过程中,调用wait()方法释放了对象的锁,此时线程2获得该对象的锁,线程2使用结束后,调用了对象的notify()方法,唤醒了等待中的线程1,此时线程1重新获得该对象的资源,继续执行其他操作。当然线程2也可以调用notifyAll()方法,唤醒等待队列中的所有线程。

五、结语

线程使用的过程中需要注意的地方有以下几点:

1).当正在执行的线程调用nofity()方法唤醒其他线程后,并不代表被唤醒的线程就立即获得了该资源对象的锁,必须等待上一个线程执行完同步方法或者同步代码块中的内容并释放掉对象锁后,被唤醒的对象才会获得该资源的对象锁。

2).在使用synchronized关键字修饰方法或者代码块时,一定要注意实际应用过程中的同步范围,一般在需要加锁同步的过程中尽量缩小同步的范围。因为同步的范围越大,性能也就越差。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值