线程-概述

  • Post author:
  • Post category:其他




概述

  1. 线程是独立的执行路径
  2. 程序运行时,自己没有创建线程,后天也会有多个线程
  3. main称之为主线程,为系统的入口,用于执行整个程序
  4. 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度
  5. 对同一个资源操作时,会存在资源抢夺的问题,需要加入并发控制
  6. 线程会带来额外的开销,如:cpu调度时间,并发控制开销
  7. 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致



线程的创建

  1. 继承Thread类

    a. 任务完成无返值
  2. 实现Runnable接口

    a. 任务完成无返值
  3. 实现Callable接口

    a. 任务完成有返值,是具有类型参数的泛型,他的类型参数表示的是从方法call()中返回的值,并且必须使用ExecutorService.submit()方法调用它。



线程的状态

在这里插入图片描述



线程方法

在这里插入图片描述



线程的优先级


线程的优先级(priprity)用数字表示:范围从1~10

Thread.MIN_PRIORITY=1;

Thread.MAX_PRIORITY=10;

Thread.NORM_PRIORITY=5;

/*

JDK有10个优先级,但是他与大多数的操作系统不能很好的映射,所以这种映射关系也是不确定的。

唯一可移植的方法是当调整优先级的时候只使用上述三种级别

*/

获取/改变线程优先级

getPriority()

setPriority(int xxx)

注:

先设置优先级再启动

优先级低只异味着获得调度的概率低,并不是优先级低就不会被调用了(优先级不会导致死锁),需要看cpu如何调度

cpu先执行了优先级低的会引起性能倒置



线程分类

在这里插入图片描述


守护线程(后台线程):


程序运行的时候在后台提供一种通用的服务的线程,该类下次线程并不属于程序中不可或缺的部分。

当所有非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程



线程同步

多个线程操作同一个资源

处理多线程问题,多个线程访问同一个对象,某些线程还想修改这个对象,此时就需要线程同步,线程同步其实就是一种等待机制,多个同时需要访问此对象的线程进入这个对象的等待池形成队列



并发问题


并发

:同一个对象被多个线程同时操作



队列和锁



锁机制:synchronized


可能存在的问题



一个线程持有锁会导致其他所有需要此锁的线程挂起

在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题

如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级导致,引起性能问题



同步方法和同步块


同步方法



需要同步哪个方法则在该方法上添加synchronized即可,synchronized指向this


同步块




synchronized(obj){}


Obj称为同步监视器:

obj可以是任何对象,但是推荐使用共享资源作为同步监视器

同步方法中无需执行同步监视器,因为同步方法的同步监视器就是this,即对象本身


同步监视器的执行过程:


第一个线程访问,锁定同步监视器,执行其中代码

第二个线程访问,发现同步监视器被锁定,无法访问

第一个线程访问完毕,解锁同步监视器

第二个线程访问,发现同步监视器没有锁,然后锁定并访问



死锁


死锁产生的条件

  • 互斥条件:一个资源每次只能被一个进程使用
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
  • 循环等待条件:多干进程之前形成一种头尾想接的循环等待资源关系



线程协作

在这里插入图片描述



版权声明:本文为weixin_41851906原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。