Java 面试(四) 线程相关

 

1、开启线程的三种方式?

  • 继承Thread类,调用start();
  • 实现Runnable接口,将该类的对象作为构造参数创建一个Thread对象,调用start()方法;
  • Timer类和和TimerTask类,TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。而每个Timer对象都是一个后台线程,用于执行所有定时器的任务
  • Callable接口(接口方法为call())和Future接口;

 

2、线程和进程的区别?

  进程是OS进行资源分配的基本单位,进程让系统有了并发处理程序的能力;

  线程是CPU进行实际调度的基本单位,线程是为了更好地提高并发程度;

 

3、为什么要有线程,而不是仅仅用进程?

  进程的创建、切换开销太大,影响了系统并发的程度;

  线程的开销小;

 

4、run()和start()方法区别

  run()是线程体,它代表了线程需要完成的具体任务;

  start()方法的目的是创建新线程,并执行该线程对象的run()方法。调用start()方法后,新线程进入就绪状态;

 

5、如何控制某个方法允许并发访问线程的个数?

  信号量(Semaphore)用来限制访问有限资源的线程数量。

  通过acquire()方法实现,保证只有规定数目的资源可以被使用;

 

6、在Java中wait和sleep方法的不同?

  运行的线程执行了wait()方法,JVM会把该线程放入等待池中,即等待阻塞。在对象上调用wait()方法时,首先要检查当前线程是否获取到了该对象上的锁。若没有,会直接抛出IllegalMonitorStateException异常。如果有锁,就会把当前线程添加到对象的等待集合中,并释放其所拥有的锁,这样另一个线程就可以获得当前对象的锁,从而进入synchronized()方法中。

  运行的线程执行了sleep()或join()方法,JVM将它置为阻塞状态。当sleep()方法状态超时,线程进入就绪状态。sleep()和yeild()方法并不释放锁;

 

7、谈谈wait/notify关键字的理解

  在对象上调用wait()方法时,首先要检查当前线程是否获取到了该对象上的锁。若没有,会直接抛出IllegalMonitorStateException异常。如果有锁,就会把当前线程添加到对象的等待集合中,并释放其所拥有的锁,这样另一个线程就可以获得当前对象的锁,从而进入synchronized()方法中。

  sleep()和yeild()方法并不释放锁,调用wait()方法后,当前线程被阻塞,无法继续执行,知道被等待集合移除。

  引起某个线程从对象的等待集合中被移除的原因有:

  • 对象上的notify()方法被调用;
  • 对象上的notifyAll()方法被调用;
  • 线程被中断;
  • 对于有超时限制的wait操作,当超过时间限制时;

  从上面的说明中,总结三条结论:

  (1) wait/notify/notifyAll操作需要放在synchronized代码块或者方法中,这保证执行它们时,当前线程已经获得所需要的锁;

  (2) 当对象的等待集合中的线程数目无法确定时,最好使用notifyAll()方法而不是notify()方法;

  (3) notifyAll()方法会导致线程在没有必要的情况下被唤醒而产生性能影响,但是使用上更简单。

 

8、什么导致线程阻塞?

  阻塞是线程因为某种原因放弃CPU的使用权。有三种情况:

  • 等待阻塞;
  • 同步阻塞;
  • 其他阻塞

 

9、线程如何关闭?

  (1) 线程正常执行完毕,正常结束

  也就是让run方法执行完毕,该线程就会正常结束。但有时候线程是永远无法结束的,比如while(true)。

  

  (2) 监视某些条件,结束线程的不间断运行
  需要while()循环在某以特定条件下退出,最直接的办法就是设一个boolean标志,并通过设置这个标志来控制循环是否退出。

  

  (3) 使用interrupt方法终止线程
  如果线程是阻塞的,则不能使用方法2来终止线程。

  参考 

 

10、Java中线程同步的方法

  参考      参考2

 

11、数据一致性如何保证?

  

 

12、如何保证线程安全?

  

 

13、如何实现线程同步?

  

 

14、两个进程同时要求写或者读,能不能实现?如何防止进程的同步?

  

 

15、线程间操作List

  

 

16、Java中对象的生命周期

  

 

17、Synchronized用法

  

 

18、synchronize的原理

  

 

19、谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解

  

 

20、static synchronized方法的多线程访问和作用

  

 

21、同一个类里面两个synchronized方法,两个线程同时访问的问题

  

 

22、volatile的原理

  

 

23、谈谈volatile关键字的用法

  

 

24、谈谈volatile关键字的作用

  

 

25、谈谈NIO的理解

  

 

26、synchronized 和volatile 关键字的区别

 

 

27、synchronized与Lock的区别

 

 

28、ReentrantLock 、synchronized和volatile比较

 

 

29、ReentrantLock的内部实现

 

 

30、lock原理

 

 

31、死锁的四个必要条件?

 

 

32、怎么避免死锁?

 

 

33、对象锁和类锁是否会互相影响?

 

 

34、什么是线程池,如何使用?

 

 

35、Java的并发、多线程、线程模型

 

 

36、谈谈对多线程的理解

 

 

37、多线程有什么要注意的问题?

 

 

38、谈谈你对并发编程的理解并举例说明

 

 

39、谈谈你对多线程同步机制的理解?

 

 

40、如何保证多线程读写文件的安全?

 

 

41、多线程断点续传原理

 

 

42、断点续传的实现

posted @ 2018-03-27 02:10  爆炸的果核  阅读(105)  评论(0编辑  收藏  举报