美文网首页
线程相关QA

线程相关QA

作者: Cocoonshu粽子 | 来源:发表于2018-03-29 21:32 被阅读18次

Q:用户线程和守护线程有什么区别

java中的线程分为两种:守护线程(Daemon)和用户线程(User)。
通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程
唯一的区别是判断虚拟机(JVM)何时离开,Daemon是为其他线程提供服务,如果全部的User Thread已经撤离,Daemon 没有可服务的线程,JVM撤离。也可以理解为守护线程是JVM自动创建的线程(但不一定),用户线程是程序创建的线程;比如JVM的垃圾回收线程是一个守护线程,当所有线程已经撤离,不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。

Q:多线程实现方式?(最基本的)

extends Thread
implements Runnable
implements Callable<V>
ExecutorService
详见代码https://github.com/Pluto4ever/neptune/tree/master/neptune-web/src/main/java/com/neptune/test/thread

Q:Java线程的几种状态,以及转换方式

新建(new):新建一个线程的对象。
可运行(runable):线程对象创建后,其他线程调用该线程的start方法。或者该线程位于可运行线程池中等待被线程调用,已获取cpu的使用权。
运行(running):可运行的线程获取了cpu的使用权,执行程序代码。
阻塞(block):由于某些原因该线程放弃了cpu的使用权。停止执行。除非线程进入可运行的状态,才会有机会获取cpu的使用权。
  1. 等待阻塞:运行中的线程执行wait方法,这时候该线程会被放入等待队列。
  2. 同步阻塞:运行中的线程获取同步锁,如果该同步锁被别的线程占用,这个线程会成被放入锁池,等待其他线程释放同步锁。
  3. 其他阻塞:运行的线程执行sleep或者join方法这个线程会成为阻塞状态。当sleep超时,join等待线程终止,该线程会进入可运行状态。
死亡(dead):线程run mian 执行完毕后,或者因为某些异常产生退出了 run 方法,该线程的生命周期结束。


image.png

Q:sleep()和wait()的区别

  • 两个方法来自不同的类分别是Thread和Object
  • sleep方法没有释放锁;wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码和方法锁)
  • wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
  • sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
  • sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
  • 注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程
  • wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生
  • 如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
  • 需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到wait()/sleep()/join()后,就会立刻抛出InterruptedException。
  • waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronizedblock中进行调用,虽然能编译通过,但在运行时会发生illegalMonitorStateException的异常。
    补充两个重要的方法:yield()和join()
    yield方法
  • 暂停当前正在执行的线程对象。yield()方法是停止当前线程,让同等优先权的线程或更高优先级的线程有执行的机会。如果没有的话,那么yield()方法将不会起作用,并且由可执行状态后马上又被执行。
  • join方法是用于在某一个线程的执行过程中调用另一个线程执行,等到被调用的线程执行结束后,再继续执行当前线程。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。

Q:怎样理解synchronized关键字

synchronized代表加锁,分为synchronized 方法和 synchronized 块。

  • synchronized 方法
    每个synchronized方法都必须获得调用该方法的类实例的锁方能执行,每个类实例对应一把锁。方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。
  • synchronized 块
    通过 synchronized关键字来声明synchronized 块
synchronized(syncObject)
{  
//允许访问控制的代码  
} 

Q::一个线程,进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法

如果其他方法不是synchronized方法,可以进入,如果是synchronized方法将不能进入

Q:synchronized锁重入是什么鬼

多道门用的是同一把锁,你已经有钥匙了,过每道门不需要每次拿钥匙去开,只要钥匙没还回去,还在你手里,那就直接过。这就叫锁的可重入。

Q:synchoronized修饰代码块

对synchronized (this)的一些理解

  • 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

  • 当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

  • 然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的除synchronized(this)同步代码块以外的部分。

  • 第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

  • 以上规则对其它对象锁同样适用。

Q:volatile关键字

Q:ThreadLocal用法

Q:乐观锁、悲观锁

Q:Java中CAS

Q:自旋锁

Q:Java -- 偏向锁、轻量级锁、自旋锁、重量级锁

Q:java.util.concurrent介绍

Q:对象锁、方法锁、类锁

Q:可重入锁、可中断锁、公平锁、读写锁

相关文章

  • 线程相关QA

    Q:用户线程和守护线程有什么区别 java中的线程分为两种:守护线程(Daemon)和用户线程(User)。通过方...

  • [QA]反劫持相关

    一、CDN相关 CDN,即内容分发网络,简单说就是把静态数据分布在很多CDN节点服务器上,CDN系统能实时根据网络...

  • QA工作梳理

    1. 敏捷团队下的QA 1.1 敏捷QA的职责 敏捷QA的主要职责是主导并促使与质量相关的活动在团队内发生,包...

  • Redis-缓存相关QA

    1. 为什么Redis性能这么强 支持数十万的并发(32G可以Set操作达到30W的QPS, Get操作40W的Q...

  • android handler、生命周期、观察者模式事件编程

    先阅读一个:原文链接简书转载链接 handler总体思路:假设:公开的队列QA,A线程,B线程,A私有的Loope...

  • 医药招聘:山东烟台qa工程师,主管

    招聘:山东烟台qa工程师,主管岗位,至少两年qa经验 本科学历 药学及相关专业 待遇10w-30w

  • android linux pThread使用

    线程的相关方法 方法前缀相关功能pthread_线程本身和各种相关函数pthread_attr_线程属性对象pth...

  • iOS面试进阶篇(二)

    目录 UITableViewCell相关试题多线程相关试题进程与线程相关试题网络相关试题TCP与UDPTCP连接的...

  • 线程相关

    1.线程创建 继承Thread 实现Runnable接口 实现callable接口 1.1继承Thread 说下静...

  • 线程相关

    线程池:1.共有四种:Executors 2.改线程设置优先级: 3.AsyncTask的使用:线程优先级为bac...

网友评论

      本文标题:线程相关QA

      本文链接:https://www.haomeiwen.com/subject/webycftx.html