一、Java 中使用多线程的方式有哪些?大概这么4种:extends Thread;implRunnable;implCallable通过 FutureTask包装器来创建线程;使用ExecutorService、Callable、Future实现有返回结果的多线程。;extends Thread 和 implRunnable 的线程没有返回值, 而FutureTask ExecutorService(ExecutorService.submit(xxx) return Future<?> )有返回值二、说一下线程的几种状态?第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。三、如何实现多线程中的同步?多线程同步和异步不是一回事。几种情况,1.就是大家说的synchronized 他可以保证原子性,保证多个线程在操作同一方法时只有一个线程可以持有锁,并且操作该方法,2.就是手动调用读写锁3.手动操作线程的wait和notify4.volatile我记得是没有原子性的,他可以保证内存可见性,在多线程的情况下保证每个线程的数据都是最新的四、死锁的定义多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。五、死锁产生的原因系统资源的竞争2. 进程推进顺序非3.信号量使用不当也会造成死锁。六、死锁产生的必要条件互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。
点赞 3
评论 2
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务