线程的概述

1.线程和进程

        进程是程序执行的一个过程,是系统运行的基本单位,而线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

2.如何创建线程

        创建线程一般来说有很多方式,例如继承Thread类,实现Runnable接口,实现Callable接口,使用线程池等等,但实际上只有一种方法可以创建线程,那就是new Thread().start();

3.线程的状态

        初始状态:线程被创建出来,但是为调用方法start()启动

        运行状态: 线程被调用了start(),等待运行的状态

        阻塞状态:需要等待锁释放

        等待状态:线程需要等待其他线程做出一些待定的动作(通知或中断)

        超时等待状态:可以在指定的时间后自行返回,例如sleep();

        终止状态:表示该线程已经运行完毕

4.线程上下文切换

        线程在执行过程中会有自己的运行条件和状态,也称为上下文,当出现以下状态时,线程会从占用CPU状态中退出

        1.主动让出CPU,比如调用了wait(),sleep()等

        2.时间片用完,操作系统要防止一个线程或进程长时间占用CPU导致其他线程或进程饿死

·       3.被终止或结束运行

        线程切换意味着需要保存当前线程的上下文,留着线程下次占用CPU的时候恢复,并加载下一个要使用CPU的线程上下文,这就是线程上下文切换

5.线程的sleep()和wait()方法的区别

        1.sleep()方法没有释放锁,而wait()方法释放了锁

        2.sleep()方法通常用于暂停线程执行,而wait()通常用于线程间交互、通信

        3.sleep()方法执行后,不需要别的方法唤醒,而是会自动苏醒,而wait()方法调用后则需要别的线程调用同一个对象shang的notify()或者notifyAll()方法,或者使用wait(long timeout)方法设定等待时间

        4.sleep()时Thread类的静态本地方法,wait()则是Object类的本地方法

6.为什么wait()方法不定义在Thread类中

        wait()是让获得对象锁的线程实现等待,会自动释放当前线程占有的对象锁,每个对象都拥有对象锁,既然要释放当前线程占用的对象锁并让其进入等待状态,自然是要操作对象而不是线程

7.可以直接调用Thread类中的run()方法吗

        可以,但是不先调用start()使线程进入就绪状态就直接调用run()方法,会把run()当初main线程下的普通方法执行,而不是会在某个线程中执行,

8.并行和并发

        并发:两个及两个以上的作业在同一 时间段 内执行。

        并行:两个及两个以上的作业在同一 时刻 执行。

最关键的点是:是否是 同时 执行。

9.同步和异步的区别

        同步:发出一个调用之后,在没有得到结果之前, 该调用就不可以返回,一直等待。

        异步:调用在发出之后,不用等待返回结果,该调用直接返回。

10.线程死锁

        10.1 什么是线程死锁

                多个线程同时被阻塞,他们中的其中一个或者全部都在等某个资源被释放,由于线程被无限期阻塞,因此程序不能正常结束,这就是线程死锁

        10.2 如何检测死锁

                使用jmapjstack等命令查看 JVM 线程栈和堆内存的情况。如果有死锁,jstack 的输出中通常会有 Found one Java-level deadlock:的字样,后面会跟着死锁相关的线程信息。另外,实际项目中还可以搭配使用topdffree等命令查看操作系统的基本情况,出现死锁可能会导致 CPU、内存等资源消耗过高。

        10.3 如何预防和避免死锁

                10.3.1 如何预防死锁

                        破坏死锁的产生的必要条件即可:

                                破坏请求与保持条件:一次性申请所有的资源。

                                破坏不剥夺条件:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。

                                破坏循环等待条件:靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。

                10.3.2 如何避免死锁

                        避免死锁就是在资源分配时,借助于算法(比如银行家算法)对资源分配进行计算评估,使其进入安全状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值