线程

  • 线程与进程的区别
    1, 进程是一个可以独立执行的单元,一个进程就是一个应用程序;而线程则是进程中一个任务的执行单元。线程是进程的子集。
    2, 进程拥有独立的内存地址,而线程则是共享一块连续的内存。

  • 线程的实现有哪些方式,哪种方式更好
    1, 继承Thread类
    2, 实现Runable接口
    由于java不支持多继承,支持多实现。故实现runable接口相对来说更好。

  • 线程的start、run 方法的区别 ;wait 、sleep 、notify 、join 、yeild 分别是什么
    1, 线程的start方法是开启一个新线程,而run方法则和普通的方法一样执行,不能开启一个新线程。
    2, wait 方法可以让当前线程暂停执行,并且是放弃对象锁的。当调用notify方法后使得当前线程进入等锁池;sleep方法可以让当前线程休眠一定的时间,只是并不释放掉对象锁,当休眠时间到了,立即转入到就绪状态;notify方法是随机选择一个在当前对象上执行wait方法的线程,解除其阻塞状态。(ps:当前线程必须是锁的持有者)
    3, join方法让调用该方法的thread完成run方法里面的内容执行完毕,再去执行join后面的代码段;yeild方法线程放弃运行,将cpu的控制权让出来。它与sleep的不同之处在:它让出控制权之后,可能由于优先级较高会马上再次获得执行机会,进而接着运行。而sleep则是在指定的时间之内一定不会再次获得cpu执行权,必须等到休眠时间完成。

  • 线程调度策略
    抢占式调度策略
    时间片轮转调度策略

  • 多线程
    好处:1, 降低创建销毁线程的资源消耗 2, 提高响应速度 3, 提高线程的可管理性
    概念:线程池的顶级接口是Executor,真正的线程池接口是ExecutorService,它的具体实现的ThreadPoolExecutor。普通类Executors里面调用的就是ThreadPoolExecutor。
    创建一个线程池:ExecutorService pool = Executors.newCachedThreadPool();

    Executors提供四种线程池:
    1,newCachedThreadPool,可根据需要创建新线程的线程池
    2,newSingleThreadPool,只有一个线程的线程池
    3,newFixedThreadPool,固定大小的线程池
    4,newScheduledThreadPool,大小无限的线程池

    线程池相关参数:

public ThreadPoolExecutor(int corePoolSize,
                         int maximumPoolSize,
                         long keepAliveTime,
                         TimeUnit unit,
                         BlockingQueue workQueue,
                         ThreadFactory threadFactory) {
   this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 
       threadFactory, defaultHandler);
}

1,corePoolSize 线程池的核心线程数,一般情况下,不管有没有任务都会在线程池中存在
2, maximumPoolSize 最大线程数量,当活动的线程数达到这个数字后,后面的任务将会被阻塞。
3, keepAliveTIme 控制闲置线程存活时间,一般用在非核心线程。
4, unit 指定keepAliveTime的时间单位,是枚举类型,主要有 TimeUnit.HOURS、TimeUnit.MINUTES
5, workQueue 线程池的任务队列
6, threadFacory 线程工厂,它是一个接口,用来为线程池创建新的线程

线程池的关闭:shutdown ,不会立即终止线程池,而是要等到任务缓存队列中的任务都执行完毕才终止,不会接受新的任务。shutdownNow,立即关闭线程池,并尝试打断正在执行的任务,清空缓存队列,返回未执行的任务。

Executor框架:是一个根据一组执行策略调度、执行、控制异步任务的框架。
Executors类:用于方便的创建线程池。

  • 线程池工作原则
    1、当线程池中线程数量小于 corePoolSize 则创建线程,并处理请求。
    2、当线程池中线程数量大于等于 corePoolSize 时,则把请求放入 workQueue 中,随着线程池中的核心线程们不断执行任务,只要线程池中有空闲的核心线程,线程池就从 workQueue 中取任务并处理。
    3 、当 workQueue 已存满,放不下新任务时则新建非核心线程入池,并处理请求直到线程数目达到 maximumPoolSize(最大线程数量设置值)。
    4、如果线程池中线程数大于 maximumPoolSize 则使用 RejectedExecutionHandler 来进行任务拒绝处理。

你可能感兴趣的:(线程)