【并发编程】线程基础

目录

1、线程基础

1.1基本概念

1.1.1 进程与线程

1.1.1.2 什么是线程

1.1.1.3 两者间的联系和区别

1.1.2 多线程

1.1.2.1 什么是多线程

1.1.2.2 多线程的局限

1.1.3串行,并行,并发

1.1.3.1 什么是串行

1.1.3.2 什么是并行

1.1.3.3 什么是并发

1.1.3.4 区别和联系

1.1.4同步同步,阻塞非阻塞

1.1.4.1同步(Synchronous)与异步(Asynchronous)

1.1.4.2阻塞和非阻塞:

1.1.4.3 同步/异步 与 阻塞/非阻塞 之间的区别

1.2线程的创建

1.2.1线程的创建方式

1.2.1.1继承Thread类 重写run方法

1.1.2.2 实现Runnable接口 重写run方

1.1.2.3 实现Callable 重写call方法,配合FutureTask

1.1.2.4 基于线程池构建线程

1.3线程的使用

1.3.1线程的状态

1.3.2线程的常用方法

1.3.2.1 线程方法

1.3.2.2 线程的让步

1.3.2.3 线程的休眠

wait和sleep的区别?

1.3.2.4 线程的强占

1.3.2.5 守护线程

1.3.2.6 线程的等待和唤醒

1.3.3线程的结束方式

1.3.3.1 stop方法(不用)

1.3.3.2 使用共享变量(很少会用)

1.3.3.3 interrupt方式


1、线程基础

1.1基本概念

1.1.1 进程与线程

1.1.1.1 什么是进程

        进程是指运行中的程序。比如浏览器,系统会给这个程序分配一定的资源

1.1.1.2 什么是线程

        线程是CPU调度的基本单位,每个线程都是执行一个进程中的某一块代码程序片段。进程

1.1.1.3 两者间的联系和区别
  • 进程就是线程的容器,需要线程利用进程中的一些资源,处理一个代码、指令。最终实现进程锁预期的结果。就如同房子和里面的人,房子看做是进程,而人看做是线程,人在房子中做事情 ,如吃饭,学习等。
  • 两者间根本上不同:进程是操作系统分配的资源,而线程是CPU调度的基本单位
  • 资源方面:同一个进程下的线程共享进程资源,而不同的线程本身也可以拥有独立的存储空间,而不同的进程之间相互独立。      
  • 数量不同:一个进程中至少会拥有1个到多个线程。
  • 开销不同:线程是进程中的一个部分,建立和销毁都要比进程快得多,进程之间通讯会比较麻烦,需要借助内核才能实现,而线程之间通讯则简单得多

1.1.2 多线程

1.1.2.1 什么是多线程

        多线程是指:一个进程内运行的多个线程,多线程的目的是为了提高CPU的利用率,用以提升程序的执行效率,提高用户体验。

1.1.2.2 多线程的局限
  • 如果线程特别多,CPU在切换线程上下文时,会额外造成消耗。(优化:线程数的设置)
  • 任务的拆分需要依赖业务场景:有一些异构化的任务,很难对任务拆分,还有很多业务并不是多线程处理更好。
  • 线程案例问题:虽然多线程带来了一定的性能提升,但如果多线程操作临界资源,可能会发生数据不一致的安全问题,甚至在涉及到锁操作时,会造成死锁。

1.1.3串行,并行,并发

1.1.3.1 什么是串行

        串行就是从头到尾一个一个的顺序执行

1.1.3.2 什么是并行

        并行就是同时处理,多个线程对多个cpu内核,1对1处理

1.1.3.3 什么是并发

        这里的并发并不是指三高中的并发问题,是指多线程中的并发概念(CPU调度线程的概念),同一时刻多个线程访问同一个资源。

1.1.3.4 区别和联系

        并行囊括并发,并行就是多核CPU同时调度多个线程,是真正的多个线程同时执行,而单核CPU则无法实现并行效果,只能高速切换线程,实现并发。

1.1.4同步异步,阻塞非阻塞

1.1.4.1同步(Synchronous)与异步(Asynchronous)

        同步、异步关注的是消息通信机制(synchronous communication/ asynchronous communication)。

        同步、异步分为两种情况:多线程/多进程并发的同步异步 和 I/O操作的同步异步

1)并发的同步和异步

  •  同步:当调用者A发起一个调用B,在没得到结果之前,该调用B就不返回,这样导致的结果是调用者A需要一直等待,直到被调用者B返回处理结果,才能继续后续的操作。
  •  异步:当调用者A发起一个调用B,被调用者B直接返回,但是此时并没有返回操作处理结果(比如说IO读写操作),等操作任务处理完成后,通过状态改变、通知或者回调函数等方式主动通知调用者A,也就是说调用者A被动接受处理结果。
  • 并发的同步和异步的区别:请求发出后,是否需要等待处理结果,才能继续执行其他的操作。对于同步来说,调用者主动等待调用结果;对于异步来说,调用者是被动等待调用结果。

2)I/O操作的同步异步

        对于I/O操作来说,会涉及到操作系统的内核(kernel)系统调用。因为I/O操作都是通过调用内核提供的系统调用来完成的。

        当进行I/O读写操作时,涉及到内核空间和用户空间。内核空间对应的是内核态,用户空间对应的是用户态。

        同步I/O操作:I/O请求操作会导致请求进程阻塞,直到I/O操作完成。I/O模型有:阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O。

        同步I/O的缺点:“进行I/O的过程中函数无法返回,所以导致调用该函数的进程或线程不能执行其他任务!

        异步I/O操作:I/O请求操作不会导致请求进程阻塞。I/O模型有:异步I/O。

1.1.4.2阻塞和非阻塞:

       阻塞和非阻塞强调的是进程/线程在等待调用结果(消息、返回值)时的状态。

  • 阻塞:在调用结果返回之间,当前进程/线程会被挂起,不能继续往下执行,被调函数只有在得到结果之后才会返回。这点和同步函数是一样的。阻塞模式会导致进程/线程挂起。  
  • 非阻塞:在发起一个调用后,无论结果怎样(有结果就返回结果,没有结果就返回错误。总之,它不会阻塞当前线程,而是会立刻返回)。但是要每隔一段时间来check一下之前的操作是否完成。其实,这样的过程就叫做轮询(poll)。非阻塞模式不会导致进程/线程挂起。   
1.1.4.3 同步/异步 与 阻塞/非阻塞 之间的区别

        同步异步指的是通信模式,即被调用者结果返回时通知进程/线程的一种通知机制。

        阻塞和非阻塞指的是调用结果返回前进程/线程的状态。      

参考他人的概念图:

  

1.2线程的创建

1.2.1线程的创建方式

1.2.1.1继承Thread类 重写run方法

费话不多说,直接上代码

public class MiTest {

    public static void main(String[] args) {
        MyJob t1 = new MyJob();
        t1.start();
        for (int i = 0; i < 100; i++) {
          
  • 31
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxtx-0510

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值