Java多线程中问题杂谈(2)~

125 阅读3分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战核心线程和非核心线程的区别?

  • 向线程池提交任务时,首先创建核心线程运行的任务,直到核心线程达到上限,然后会将任务放到阻塞队列
  • 只有核心线程数达到上限,且阻塞队列满的情况下,才会创建非核心线程运行任务。
  • 当核心线程闲置时,不会被回收,而非核心线程则会。

线程死锁问题?

  • 死锁的理解:不同线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程死锁。

  • 说明:

    • 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续执行。
    • 我们使用同步时,要避免死锁。

如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建线程方式强大?

  • call()方法可以有返回值的。
  • call()方法可以抛出异常,被外面的操作捕获,获取异常信息。
  • Callable接口支持泛型。

volatile含义?

volatile关键字是用来保证变量的有序性和可见性的,防止指令进行重排序优化。

Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?

  • 修饰静态方法以及同步代码块:synchronized (类.class)用法锁的是类,线程想要执行对应同步代码,需要获得类锁。
  • 修饰成员方法:线程获取的是当前调用该方法的对象实例的对象锁。

什么是线程池(thread pool)?

  • 事先创建若干个线程放入容器中以备使用,需要的时候从线程池中拿线程不需要自己创建,用完后不用销毁放回线程池即可,从而减少线程不断创建和销毁对系统的开销,提高性能。

请说明一下线程池有什么优势?

  • 降低资源的消耗,通过重复利用已创建的线程降低现成的创建的和销毁的消耗。
  • 提高响应速度,当任务到达时,任务不需要等待线程的创建就能执行。
  • 提高线程的管理性,使用线程可以进行统一分配,调优和监控。

sleep()方法和yield()方法有什么区别?

  • sleep()方法给其他线程运行机会时不会考虑线程优先级,因此会给低优先级的线程以更大的运行机会;yield()方法只会给相同的优先级或者更高优先级的线程以运行的机会。
  • 线程执行sleep()方法后线程转入阻塞状态,而执行yield()方法后会转入就绪状态。
  • sleep()方法声明抛出InterruptedException,而yield()方法不会
  • sleep()方法比yield()方法具有更好的移植性

请说明一下sleep() 和 wait() 有什么区别?

  • sleep()是线程类的方法,导致线程暂时停止执行 一段时间,让其他线程先执行,但并不释放此时用来监控他的锁,不释放对象资源,释放CPU资源,等到指定时间过后,则自动恢复继续执行。
  • wait()是Object类的方法,执行此方法后导致本线程释放监视用的对象锁,释放对象资源,释放CPU资源,将此对象放在等待锁定池,只有针对此对象发出notfiy()方法(或者notfiyAll())后本线程才进入对象锁定池准备获得对象锁重新进入运行状态。