java 多线程机制

程序时一段静态的代码,进程是程序的一次动态执行过程(从代码加载、执行至执行完毕)

线程不是进程,线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自己的产生、存在和消亡的过程
和进程可以共享操作系统的资源类似,线程间也可以共享进程中的某些内存单元(包括代码和数据),并利用这些共享单元来实现数据交换、实时通讯与必要的同步操作
与进程不同的是,线程的中断与恢复可以更加节省系统的开销

主线程=main线程

线程的状态与生命周期
1、新建
当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态,此时他已经有了相应的内存空间和其他资源

2、运行
线程创建后仅仅是有了内存资源,在JVM管理的线程中还没有这个线程,此线程必须调用start()方法通知JVM

当JVM将cpu使用权切换给线程时,如果线程是Thread的子类创建的,该类中的run()方法就立刻规定了该线程的具体使命。所以程序必须在子类中重写父类的run()方法,其原因是Thread类中的run()方法没有具体的内容,程序要在Thread类的子类中重写run()方法来覆盖父类的run()方法。在线程没有结束run()之前,不要让线程再调用start()方法,否则会发生IllegalThreadStateException异常

3、中断
有4中原因的中断
·JVM将CPU资源从当前线程切换给其他线程,使本线程让出cpu的使用权处于中断状态

·线程使用cpu资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状态(sleep(int millsecond)方法是Thread类的一个类方法,线程一旦执行了sleep方法,就立刻让出CPU的使用权,使当前线程处于中断状态,经过参数millsecond指定的毫秒数后,该线程就重新进到线程队列中排队等待CPU资源)

·线程使用cpu资源期间,执行了wait()方法,使得当前线程进入等待状态。等待状态的线程不会主动进到线程队列中排队等待cpu资源,必须由其他线程调用notify()方法通知它,使得它重新进到线程队列中排队等待CPU资源
·线程使用CPU资源期间,执行某个操作进入阻塞状态,比如执行读写操作引起阻塞,进入阻塞状态时线程不能进入排队队列,只有当引起阻塞的原因消除时,线程才重新进到线程队列中排队等待CPU资源

4、死亡
处于死亡状态的线程不具有继续运行的能力,线程死亡的原因有二,一是正常运行的线程完成了它的全部工作,即执行完run()方法中的全部语句,结束了run
方法;另一个原因是线程被提前强制性地终止了,即强制run()方法。所谓死亡状态就是线程释放了实体,即释放了分配给线程对象的内存

线程的常用方法
1、start()
线程调用该方法启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了,start()方法之后,就不必要再调用start()方法了,否则会报错

2、run()
定义线程对象被调度之后所执行的操作,是系统自动调用而用户程序不得不引用的方法

3、sleep(int millsecond)
线程的调度是根据其优先级高低顺序进行的,当高优先级的线程未死亡时,低优先级的线程就没有机会获得CPU资源。有时,优先级高的线程可能需要优先级低的线程做一些配合工作,或者是优先级高的线程需要完成一些费时的工作时,此时优先级高的线程应该让出CPU资源,使优先级低的资源有机会执行。
为达到这个目的,可以在优先级高的线程的run()方法中调用sleep(int millsecond)方法来使自己暂时地放弃CPU资源,放弃时间即休眠是以毫秒为单位的

4、isAlive()
线程处于新建状态时,线程调用isAlive()方法返回flase。
当一个线程调用start()方法,并占有CPU资源后,该线程的run()方法就开始运行,在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive方法返回true。
当线程进入死亡后,isAlive返回false。

5、currentThread()

返回当前正在使用CPU资源的线程

6、interrupt()
当一些线程调用sleep方法处于休眠状态时,一个占有CPU资源的线程可以让休眠的线程调用interrupt()方法吵醒自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新等待CPU资源

线程同步

当一个线程A用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待A该线程使用完该synchronized

协调同步的线程

线程联合

一个线程A在占有CPU资源期间,可以让其他的线程调用join()和本线程联合
B.join();
我们称A在运行期间联合了B,如果线程A在占有CPU资源期间一旦联合B线程,那么A线程就会立刻中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行。如果A准备联合的B线程已经结束,那么B.join();不会产生任何效果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值