美文网首页
线程基础

线程基础

作者: Orange_粒橘 | 来源:发表于2021-07-06 20:20 被阅读0次

    什么是线程和进程?

    答:程序的每一次执行都是一个进程,每个进程中有多个线程

    请简要描述线程与进程的关系,区别及优缺点?

    答:一个进程中有多个线程,进程和线程的最大区别就是每一个进程都是独立的,进程之间不会相互影响,但多个线程之间可能会相互影响,还有就是线程执行开销小,不易于资源管理,进程是和线程相反

    说说并发与并行的区别?

    答:并发:多个任务在同一段时间内一同执行

    并行:多个任务在同一时间点同时执行

    为什么要使用多线程呢?

    答:线程可以看做是轻量级的进程,线程是程序执行的最小单位,而线程的调度和切换所花费的成本要远远小于进程。而且我们现在很多系统都是百分级和千万级的并发量,使用好多线程可以帮我们提高系统并发和性能

    使用多线程可能带来什么问题?

    答:我们使用多线程是因为他可以帮我们提高程序的执行效率和运行速度,但多线程并不能一直帮我们提高程序的运行速度,而且使用多线程会出现很多问题,比如:死锁,内存泄漏,上下文切换等

    说说线程的生命周期和状态?

    新生状态---就绪状态---运行状态---阻塞状态---等待状态---等待超时状态----终止状态

    当线程创建的时候,是处在新生状态,调用start()方法后,线程处于可运行状态,当可运行状态的线程获得到CPU时间片时,就处于运行状态。当线程调用wait()方法时,线程就会进入到等待状态,等待状态的线程需要依靠其他线程的通知才能回到运行状态,而超时等待状态就是在等待状态的前提下添加了超时时间,当超时时间到了之后,线程就会进入到运行状态。当线程调用同步方法时,没有获得到锁的时候,就会进入到阻塞状态,当线程调用Runnable的run()方法时,线程会进入到终止状态。

    什么是上下文切换?

    一个任务在执行一个CPU时间片之后就会切换成另一个任务,,而之前的任务状态会保存起来,等下一次轮到运行时,就再重新加载任务的状态。而任务保存状态到重新加载的过程就是一次上下文切换

    什么是线程死锁?如何避免死锁?

    当两个或多个线程同时占用对方所需要的资源,导致线程一直处在等待状态,就是线程死锁

    需要满足四个条件才会出现线程死锁:

    ①互斥条件:一个资源只能让一个线程占有②请求和保持条件:一个线程因请求资源而阻塞时,他之前所占有的资源不放③不剥夺条件:一个线程不能剥夺另一个线程所占有的资源,只能等那个线程执行完之后,将资源释放④等待循环条件:当发生死锁时,每一个线程都会进入到一个死循环的状态

    我们可以通过破坏四个条件中的一个来避免死锁

    说说 sleep() 方法和 wait() 方法区别和共同点?

    sleep()方法和wait()方法都是让线程暂停执行。他们两个方法最大的区别就是wait()方法会释放锁而sleep()方法不会释放锁。当wait()方法执行之后,需要其他线程调用统一对象上的notify()或者notifyAll()方法才会苏醒,而sleep()方法执行完成之后线程会自动苏醒,wait(long time)超时时间到了之后也会自动苏醒

    为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?

    当我们创建线程的时候,线程是处于新生状态,调用start()方法后就处于就绪状态,等待CPU分配时间片之后就会进入到运行状态,而start()方法就是会帮我们做好准备工作,然后自动调用run()方法的内容,这就是多线程工作。如果我们调用run()方法的话,会把run()方法当成main线程下的一个普通方法,不会在某个线程中去执行他,这就不是多线程工作。

    相关文章

      网友评论

          本文标题:线程基础

          本文链接:https://www.haomeiwen.com/subject/jpjaultx.html