java并发面试题(四)

  1. java有几种线程?
    答:java中的线程分为守护线程(Daemon)和用户线程(User)两种。

  2. 怎么把线程设置为守护线程?
    答:通过Thread.setDaemon(true)方法可以把线程设置为守护线程。但是这个方法一定要在Thread.start()方法前调用,不能把正在运行的常规线程设置为守护线程,否则在运行时会抛出IllegalThreadStateException异常

  3. 说说对守护线程和用户线程的理解?
    答:守护线程是为用户线程服务的,比如JVM的垃圾回收线程就是守护线程,但没有任何用户线程存在时,守护线程也就没有了可服务的对象,那么这是虚拟机就会自动退出。

  4. 在守护线程(Daemon)中产生的新线程是什么类型的?
    答:也是Daemon类型。

  5. 如何在两个线程间共享数据?
    答:可以通过共享对象来实现这个目的,或者是使用像阻塞队列这样并发的数据结构。用wait和notify方法实现了生产者消费者模型。

  6. Java中notify和notifyAll有什么区别?
    答:notify()方法不能指定唤醒某个具体的线程,随机的,不过如果能确定只有一个线程在等待时,用它就没错了。而notifyAll()方法就不一样了,它是唤醒全部等待的线程,让它们一起去竞争锁,这样确保至少有一个线程能继续运行。

  7. 为什么wait,notify和notifyAll这些方法不定义在Thread类里面?
    答:首先要知道java中提供的锁都是对象级别的,而不是线程级别。wait,notify和notifyAll这些方法都是对锁的操作,而锁是对象才有的,所以要把他们定义在Object类中而不是Thread类。

  8. 为什么wait和notify方法要在同步块中调用?
    答:因为JavaAPI强制要求要这样做,否则代码会抛出IllegalMonitorStateException异常。还有一个原因是为了避免wait和notify之间产生竞态条件。

  9. Thread 类中的yield方法有什么作用?
    答:yield()方法是静态的native方法。调用它可以使当前线程让出CPU资源,暂停当前正在执行的线程对象,让其它有相同优先级的线程执行。不过即使调用了yield()方法,也不能保证其他线程一定能顺利执行,因为yield()方法并不会释放锁,很可能就是暂停一下,然后就继续执行当前线程了。

  10. 说说对ThreadLocal的理解?
    答:可参考本篇博客【简析ThreadLocal

发布了202 篇原创文章 · 获赞 203 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104473801