线程

本文介绍了线程相关知识,包括线程是进程内部程序流,采用时间片轮转法实现并发。阐述了线程创建和启动的两种方式及优缺点,分析了相关类和方法。还提到线程同步机制,当多线程访问共享资源可能出现问题,以银行卡和存折取款为例,给出加锁的解决方案。

线程

程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件。
进程 - 主要指运行在内存中的可执行文件。
线程:
线程是进程内部的程序流,也就是操作系统中支持多进程,而每个进程的内部又可以支持多线程,并且线程是轻量级的,新建线程会共享所在进程的资源,因此对系统资源的消耗比较小。
线程并发:
操作系统中通常都采用时间片轮转法来实现多线程的并发执行,所谓并发就是指宏观并行微观串行的机制。
线程创建和启动方式
1.自定义类继承Thread类重写run方法,然后创建该类的对象调用start方法。
2.自定义类实现Runnable接口重写run方法,然后创建该类的对象作为实参构造
Thread类型的对象,使用Thread类型的对象调用start方法
相关类和方法的解析
Thread() - 无参的方式构造对象。
Thread(String name) - 根据参数指定的名称来构造对象。
Thread(Runnable target) - 根据参数指定的接口来构造对象。
Thread(Runnable target, String name) - 根据参数指定的接口和名称来构造对象。
run()方法

  • 若使用Runnable引用构造的线程对象调用该方法,则最终调用引用指向的版本(会调用下图中重写后的run方法)
  • 若没有 使用Runnable引用构造的线程调用该方法,则啥也不做。(不会调用重写后run方法)
    在这里插入图片描述
    start() 方法
  • 用于启动线程,Java虚拟机会自动调用该线程的run方法。
    原理分析
    1.执行main方法的线程叫做主线程,执行run方法的线程叫做子线程。
    2.main方法是程序的入口,对于start方法之前的代码来说由主线程执行一次,
    当start方法调用成功后会启动一个子线程,此时线程的个数由1个变成了2个,其中新
    启动的线程去执行run方法的代码,主线程继续执行start方法之后的代码,此时两个线程各
    自独立运行,互不影响。
    3.当main方法执行完毕,主线程结束;当run方法执行完毕,则子线程结束;两个线程之间
    没有明确的先后执行次序,由系统的调度算法来决定。
    在这里插入图片描述
    创建线程两种方式优缺点
    1.继承Thread类:
    代码相对简单,但Java语言中支持单继承,若该类继承了Thread类则无法继承其它类
    2.实现Runnable接口:
    代码相对复杂,由于接口可以多实现,因此不影响该类继承实现其他类和接口(推荐)
    常用方法
    static void sleep(times):
    在这里插入图片描述
    void join()
    在这里插入图片描述
    boolean isDaemon()
    判断是否为守护线程
    如果子线程为守护线程,那么主线程执行完毕后,子线程将不再继续执行
    在这里插入图片描述

线程锁synchronized关键字

线程同步机制
当多个线程同时访问同一种共享资源时,可能会造成数据的覆盖等不一致的问题,此时就需要对多个线程之间进行通信和协调,该机制就叫线程的同步机制。

以银行卡 存折 对应同一个账户为例
两个线程一个代表银行卡,一个代表存折,两个线程同时取款,会导致账户余额不合理
原因:线程一取款后还没来得及更新账户余额时,线程二就已经开始取款操作
解决方案:给取款操作加锁
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值