不聊接腿的事,就聊Java多线程编程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/conconbenben/article/details/102512287

    记得刚出来工作的那段时间,某大厂的技术面试人员面试的聊到的一个话题就是多线程编程,最近看多网友也问到多线程的问题,多线程确实是个经久不衰的话题。今天不聊接腿的事,就聊聊Java多线程编程。

    谈到Java多线程编程,我们需要从线程聊起。

    1.线程的生命周期。

    Java线程的生命周期分为如下几种:

  新建:创建线程对象
  就绪:拥有执行资格,但是没有执行权
  运行:有执行资格且有执行权
  阻塞:没有执行资格和执行权,但是可以被激活到就绪
  死亡:线程对象变为垃圾,等待被回收。

       下图显示了一个线程完整的生命周期。

2.线程的优先级

    每一个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。

    Java 线程的优先级是一个整数,其取值范围:1-10 。

    默认情况下,每一个线程都会分配默认的优先级5 。

    具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。

3.线程的创建

    在Java中,可以通过继承Thread类或者实现Runnable接口来定义一个线程类。不管是继承父类还是实现接口,我们一般都是把业务逻辑在类的run方法中实现。

​-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

线程的一些基本情况聊完,进入多线程子话题。

多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

4.相关概念

    a.线程同步

    即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临界区对象就是其中一种。

    b.线程死锁

    多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

    c.线程通讯

    这里主要指同一进程下的不同线程间的通讯,主要有两种模型:共享内存和消息传递。

    d.线程控制

    主要围绕线程生命周期,进行的一些操作,如:挂起、停止和恢复。

5.线程池

    创建和销毁一个线程是比较昂贵的操作,需要系统调用。频繁创建和销毁线程会影响系统性能。于是线程池应运而生。线程池线程都是后台线程。

   线程池的创建可以参考:创建线程池的4种方式

   不过, 阿里代码规范推荐使用手动创建线程池:

1)FixedThreadPool和SingleThreadPool:  允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。2)CachedThreadPool:  允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

关于线程池使用将在下一篇​:如何优雅的使用线程池 文章中介绍,​欢迎继续关注。

    ​面试中,聊到多线程话题,如果能把这些点说清楚的话,面试官对你的印象​肯定不会差。

                                                     

猜你喜欢

转载自blog.csdn.net/conconbenben/article/details/102512287