Java多线程面试题及答案(11-15)

11、Java中的sleep()和wait()方法有什么区别?
sleep()方法是Thread类中的静态方法,调用该方法可以让当前线程暂停一段时间,但不会释放锁。wait()方法是Object类中的方法,调用该方法会释放锁并让当前线程进入等待状态,直到其他线程调用notify()或notifyAll()方法来唤醒该线程。

12、synchronized关键字和Lock接口有什么区别?
synchronized关键字是Java中的内置锁,是非公平锁,只能使用wait()和notify()来进行线程间通信。而Lock接口是Java中提供的显式锁,可以是公平锁或非公平锁,同时也支持更多的高级功能,比如超时时间、中断等。

13、什么是线程池?如何使用线程池?
线程池是一种用于管理线程的技术。线程池中包含多个预先创建好的线程,可以将需要执行的任务提交给线程池,由线程池中的空闲线程来执行任务。通过重复利用已创建的线程,减少线程创建和销毁的开销,提高系统性能。

在Java中,可以使用Executors类创建线程池,使用ThreadPoolExecutor类来控制线程池的行为。使用线程池的步骤如下:

  • 创建线程池,通过Executors类提供的静态方法来创建线程池。
  • 创建任务,将需要执行的任务封装成一个Runnable或Callable接口实现类。
  • 提交任务,将任务提交到线程池中,使用execute()方法或submit()方法提交任务。
  • 关闭线程池,通过shutdown()方法或shutdownNow()方法关闭线程池。

14、什么是线程的join()方法?如何使用?
答:线程的join()方法是让当前线程等待指定线程结束的方法。使用方式为,在需要等待的线程对象上调用join()方法。

15、如何实现线程间的通信?
答:实现线程间通信的方法有:共享内存,使用wait()和notify()/notifyAll()方法进行同步,使用管道进行通信,使用BlockingQueue等并发容器等。其中,使用wait()和notify()/notifyAll()方法是最常用的方式。