1. 线程通信的几种方法:
共享内存,消息,管道,信号量,socket
2. 什么是线程:
同一个进程不同的执行路径
3. Java中线程和进程的区别:
一个进程包含很多个线程,线程是进程的子集。
4. 如何在java中实现线程:
在语言层面有两种方式,第一种是Thread类,第二种是Runnable接口.
5. Thread类中start()方法和run()方法的区别:
start()方法用来创建和启动线程,内部使用了run()方法。而run()方法本身就是一个方法直接调用不会启动新的线程。
6. Java中的Runnable和Callable有何不同?
Runnable和Callable都代表了在不同的线程中执行任务,Callable是JDK1.5之后才有的。他们的主要区别是Callable的call方法可以有返回值和抛出异常。而run()方法没有这些功能。
7. Java中的CyclicBarrier和CountDownLatch有什么区别?
都可以让一组线程等待其他线程。CountDownLatch不能重新使用,而CyclicBarrier可以重新使用。
8. Java的内存模型是什么?
Java内存模型规定和指引java程序在不同的内存架构和CPU,操作系统有确定的行为。它在多线程情况下尤为重要,java内存模型对一个线程所做的所有变动都能够被其他线程可见提供了保证。他们之间是先行发生关系。
线程内部的代码能够按照先后顺序执行
对于同一个锁,一个解锁操作发生时间一定在一个另一个锁定操作之前。也叫管程锁定规则。
前一个volatile的写操作在后一个volatile的读操作之前。也叫volatile变量规则。
一个线程内的任何操作必须在线程的start()方法调用之后,也叫做线程启动规则。
一个线程的所有操作都在线程终止之后,线程终止规则。
一个对象的终结操作必须在这个对象构造完成之后。对象终结规则。
可传递性
9. Java中的volatile变量是什么?
成员变量的特殊修饰符,volatile变量保证读操作在写操作之后。
10. 什么是线程安全?Vector是一个线程安全类吗?
每次执行的结果都和单线程执行的一样就是线程安全。Vector是用同步方法来实现线程安全的。ArrayList是非线程安全的,Vector是线程安全的;HashMap是非线程安全的,HashTable是线程安全的;StringBuilder是非线程安全的,StringBuffer是线程安全的。
11. Java中什么是竞态条件?
竞态条件会导致程序在并发的情况下出现莫名的bugs。多线程对一些资源进行竞争的时候就会出现。
12. Java中如何停止一个线程?
使用while()循环
13. 一个线程运行时发生异常会怎么样?
如果异常没有被捕获该线程会停止运行,JVM使用Thread.UncaughtExceptionHandler处理未捕获线程异常中断
14. 两个线程之间如何实现共享数据?
使用共享对象或者使用阻塞队列这种数据结构。
15. Java中notify和notifyAll有什么区别?
notify()方法不能唤醒某个具体的线程只有一个线程在等待的时候才能使用。notifyAll()唤醒所有的进程并允许他们争夺锁确保至少有一个线程能继续执行。
16. 为什么wait, notify和notifyAll不定义在Thread里面?
Java提供的锁是对象级别的而不是线程级别的,这三个都是对锁级别的操作,所有定义在Object对象中是因为锁属于对象。
17. 什么是ThreadLocal变量?
线程自己独立拥有的局部变量,防止竞争不可占用资源。
18. Java中的interrupted和isInterrupted方法的区别?
前者会在中断状态下清除后者不会。Java多线程的中断机制是用内部标识来实现的,调用Thread. Interrupt()方法来中断一个线程就会设置中断标识为true。当中断线程调用静态方法Thread. Interrupted()来检查中断状态时,中断状态会被清0,而非静态方法isInterrupted()用来查询线程中断状态且不会改变中断线程标识。一个线程的中断状态有可能被其他线程调用中断来改变。
19. 为什么wait和notify方法要在同步块中调用?
防止wait和notify之间产生竞争
20. Java中的同步集合和并发集合的区别?
同步集合和并发集合都为并发和多线程提供了合适的线程安全集合,不过并发集合的可扩展性更高。1.5并发集合更像ConcurrentHashMap,线程安全提供了锁分离,内部分区,CAS算法等技术。
21. 什么是线程池?为什么要用?
创建对象要花费时间,如果任务来时才创建线程那么响应时间会变长。而且一个进程创建的线程数有限。
22. 如何用写代码解决生产消费问题?
用一个队列,一段生产一段消费。
23. 如何避免死锁?
死锁是指两个或者两个以上的进程在执行过程中,因争夺资源而造成的互相等待的现象。死锁会让线程挂起。
互斥条件:一个资源每次只能被一个进程使用
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥脱条件:进程已获得资源,在未使用完之前,不能强行剥夺。
循环等待条件:若干个进程形成首尾相连的资源链
24. 什么是阻塞式方法?
是指程序一直等待该方法完成期间不做其他的事情,比如socket方法的accept()方法
25. Java线程池的submit()和execut()方法的区别?
都是向线程池提交任务,execut()方法返回值void,submit()方法可以返回持有计算结果的future对象。