zoukankan      html  css  js  c++  java
  • Java线程常见面试题

    多线程实现手段:

    (1)、继承Thread类 (2)实现Runable接口 (3)使用线程池

    线程控制在那个包:java.util.concurrent。

    (1)提供了线程的运行、(2)线程池的创建、 (3)线程生命周期的控制

    线程池java.util.concurrent.Executors创建线程池的四种方法

    (1) newCachedThreadPool创建非固定数量,可缓存的线程池,若线程池超过处理需要,可灵活回收空线程,若没有线程可回收,则建新

    (2) newFixedThreadPool固定线程池,底层是无界队列,可控制最大并发数,超出的线程会在队列中等待
    (3) newScheduledThreadPool定时执行线程池,支持定时及周期性任务执行
    (4) newSingleThreadExecutor单线程化的线程池,只会用唯一的工作线程来执行任务,保证所有任务按照顺序执行如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它

    Sleep()和 Wait()的区别

    (1) Sleep()是Thread的方法,Wait()是Object的方法

    (2) Sleep(休眠)暂停指定时间,执行是CPU让出来,但对象锁继续保持。休眠时间到之后自动回复就绪状态。Wait(线程暂停执行)当前线程放弃对象锁,进入等待池,调用notify() 或者 notifyall()的时候再重新获得对象锁进入就绪状态

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

    (1) sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会 
    (2) 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态 
    (3) sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常; 

    Notify()与NotifyAll()

    notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切唤醒某一个等待状态的线程,而是JVM确定唤醒哪个线程而且与优先级无关 
    notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪

    什么是线程池

    (1)面向对象编程创建销毁对象耗费时间(资源申请,对象的销毁后进入垃圾回收)

    (2)为了减少创建销毁对象,采用了线程池。先放入若干个线程,用的时候不在创建到里面拿,使用完毕不销毁,继续放回池中,减少创建和销毁的开销。

  • 相关阅读:
    CJOJ 1308 【HNOI 2002 】营业额统计 / CodeVS 1296 营业额统计(STL,二分)
    CJOJ 1131 机器分配 / Luogu 2066 机器分配 (动态规划)
    CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
    CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)
    POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat 二分)
    Luogu 1111 修复公路(最小生成树)
    POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题)
    POJ 3207 Ikki's Story IV
    洛谷 P1456Monkey King
    洛谷 P1231教辅的组成
  • 原文地址:https://www.cnblogs.com/karrya/p/11496045.html
Copyright © 2011-2022 走看看