0
点赞
收藏
分享

微信扫一扫

Java多线程与并发

非凡兔 2022-05-02 阅读 63

8-1 进程与线程的区别

进程是资源分配的最小单位,线程是CPU调度的最小单位

  • 线程不能看做是独立应用,而进程可看做独立应用
  • 进程有独立的地址空间,相互不影响;线程只是进程的不同执行路径
  • 线程没有独立的地址空间,一条线程结束,意味着进程的结束。多进程的程序比多线程程序健壮
  • 进程的切换比线程的切换开销大

进程和线程的关系

  • Java堆操作系统提供的功能进行封装,包括线程和进程
  • 运行一个程序会产生一个进程,进程包含至少一个线程
  • 每个进程对应一个JVM实例,多个线程共享JVM里的堆
  • Java采用单线程变成模型,程序会主动创建主线程
  • 主线程可以创建子线程,原则上哟啊后于子线程完成执行

8-2 线程的start和run方法的区别

  • 调用start()方法会创建一个新的子线程并启动
  • run()方法只是Thread的一个普通方法的调用,还是延用主线程。

8-3 Thread和Runnable的关系

Thread是一个类,Runnable是一个接口

  • Thread类实现了Runnable接口的类,使得run支持多线程。
  • 因为单一继承原则,推荐多使用Runnable接口
  • 创建runnable接口实现类,用new Thread(myRunnable)创建线程,抵用start();
  • 为了提高系统的可扩展性,建议使用runnable接口,便于后续给普通类赋予多线程特性

本质分析,Thread是个类,Runnable是一个接口,Thread实现了Runnable接口,Runnable接口中只有一个run()方法,该接口不具有多线程的特性,多线程的特性是依赖Thread里的start方法区创建一个子线程,在子线程中去调用Thread里实现好的run房啊,去执行相应的业务逻辑,才能让这个类实现多线程的特性。

8-4 如何处理线程的返回值

如何给run()方法传参

  • 构造函数传参
  • 成员变量传参
  • 回调函数传参

如何处理线程的返回值

  • 主线程等待法:让主线程循环等待,直到目标子线程返回值为止;
    • 缺点:是需要自己手写循环等待的逻辑 ,当需要等待的变量一多,代码会显得非常臃肿;而且无法精准控制时间
  • 使用Thread类的join()阻塞当前线程以等待子线程处理完毕
    • 缺点:粒度不够细,更精准的依赖关系join没法做到
  • 通过Callable接口实现:通过FutureTask Or 线程池获取

8-5 线程的状态

  1. 新建(New):创建后尚未启动的线程的状态
  2. 运行(Runnable):包含Running和Ready
  3. 无限期等待(Waiting):不会被分配CPU执行时间,需要被显示唤醒
  4. 限期等待(Timed Waiting):在一定时间后 会由系统自动唤醒
  5. 阻塞(Blocked):等待获取排他锁
  6. 结束(Terminated):已终止线程的状态,线程已经结束执行

8-6 sleep和wait的区别

基本的差别

  • sleep是Thread类的方法,wait是Object类中定义的方法
  • sleep()方法可以在任何地方使用
  • wait()方法只能在Synchronized方法或synchronized块中使用

最本质的区别

  • Thread.sleep只会让出CPU,不会导致锁行为的改变,不会让线程释放锁
  • Object.wait不仅让出CPU,还会释放已经占有的同步资源锁,以便让其他等待待该资源的线程得到该资源进而去运行。

8-7 notify和notifyall的区别

锁池:线程等待获取同步锁的池子

等待池:调用Object的wait方法释放锁并进入等待池的线程,不可去获取锁,只能等待被唤醒

notify:随机获取一个等待池中的线程进入锁池去竞争锁

notifyall:唤醒等待池中的全部线程进入锁池去竞争锁。

8-8 yield函数

当调用Thread.yield()函数时,会给线程调度器一个当前线程愿意让出CPU使用的暗示,但是线程调度器可能会忽略这个暗示。

8-9 interrupt函数

如何中断线程

已经被抛弃的方法:通过调用stop()方法停止线程,容易造成死锁;

目前使用的方法:

  • 调用interrupt(),通知线程应该中断了
    • 如果线程处于被阻塞状态,那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常
    • 如果线程处于正常活动状态,那么会将线程的中断标志位设置为true。被设置中断标志的线程将继续正常运行,不受影响。
  • 需要被调用的线程配合中断
    • 线程经常检查中断标志位,被设置了中断标志就自行停止线程,可以catch并处理
    • 如果线程处于正常活动状态,那么将该线程中断标志设为true,线程继续不受影响

举报

相关推荐

0 条评论