线程,线程安全,线程的生命周期

线程

  • 线程(英语:thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程.
什么是线程?什么是多线程?

进程:一个软件,在操作系统中,运行时,我们称为进程.

  • 1.什么是线程
    在一个进程中,每个独立的功能都需要独立的去运行,这时又需要把当前的进程分为多个运行区域,每个独立的小区域(小单元)称为一个线程.
  • 2.什么是多线程
    一个进程如果只有一条执行任务,则称为单线程程序.
    一个进程如果有多条执行任务,也就是说在一个进程中,同时开启多个线程,让多个线程去完成多条任务(功能).则称为多线程程序.
实现多线程的方式?用那个更好?

1.方式一:继承Thread,重写run方法;
2.方式二:实现Runnable接口,实现run方法;
3.方式二的方式更好,原因是:

  • ①避免了Java单继承的局限性;
  • ②把线程代码和任务的代码分离,解耦合(解除线程代码和任务的代码模块之间的依赖关系).代码的扩展性非常好;
  • ③方式二可以更方便、灵活的实现数据的共享
什么是线程安全问题?
  • 多线程环境中,且存在数据共享的数据被其他线程修改,那么就发生了线程安全问题.
  • 整个访问过程中,无一共享数据被其他线程修改,就是线程安全.
  • 程序中如果使用成员变量,且对成员变量进行数据修改,就存在数据共享问题,也就是线程安全问题.
如何解决线程安全问题

1.使用线程同步机制,使得在同一时间只能有一个线程修改共享数据.
2.消除共享数据:即多个线程数据不共享或者共享的数据不做修改.

  • 使用局部变量,不使用成员变量.
  • 如果使用成员变量,对成员变量不进行修改.
什么是线程同步?
  • 当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态
启动一个线程是用run()还是start()?

启动线程使用的是start()方法.

  • 当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运行.当cpu分配给它时间时,才开始执行run()方法(如果有的话).start()是方法,它调用run()方法.而run()方法是你必须重写的. run()方法中包含的是线程的主体
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁.
  • 新建: 就是刚使用new方法,new出来的线程.
  • 就绪: 就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
  • 运行: 当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
  • 阻塞: 在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法.唤醒的线程不会立刻执行run方法.它们要再次等待CPU分配资源进入运行状态;
  • 如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;

完整的生命周期图如下:
在这里插入图片描述
参考:https://www.cnblogs.com/marsitman/p/11228684.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值