lesson x

先讲明白第一个问题:
线程被创建出来后,并没有运行。
创建后调用start()方法,也没有立刻运行,而是变为了可运行的状态。
所有线程都是可运行的状态,坐在等待席,等待CPU大人叫号,叫到的运行,没叫到的等着。

被CPU大人选中后,正在占用CPU的人,状态是正在运行。但是CPU不会让你待太久,考虑到其他等待席上的线程的心情。CPU会频繁的将等待席中的线程叫进来,让它运行会。
从CPU上被换下的线程,状态又变为可运行,等待再次叫号。

调用线程的yield()方法,就相当于学雷锋,告诉CPU大人,这个线程不急,下次叫号的时候,优先考虑其他线程。


运行完的线程,状态变为中止。
如果线程运行中,产生了异常,则线程也会结束,状态变为中止。


线程在运行过程中,有可能需要等待其他线程的状况。
比如,有一个线程占用了一个同步化的对象,它会上个锁。
那么其他线程需要访问这个对象时,就会需要等待,等它用完后,把锁释放出来,其他线程才能继续进入可运行状态。

调用某个线程的join()方法,相当于要强行等待某个线程先完成。通常用于,明确的知道某线程必须要先执行完,才能执行的情况。

可以调用Thread.sleep()方法,强行让自己等待一段时间,再次进入可运行状态。


如果多个线程同一时刻,同时调用了一个对象的方法,或者修改了一个对象的属性,这就会产生问题。
所以我们需要有个语法,让某个对象的某个方法,或者某段代码,同一时间,只能有一个线程能进来。其他的都带等着。这就是同步,synronized。


但是这又带来一个问题,就是如果进入到synronized的线程,运行过程中,需要获得某个条件才能继续下去。而能改变这个条件的线程,恰好又是等待进入该synronized的,这就会出现A等B开口,B等A开口的死锁情况。
在synroized代码块中,可以通过调用锁对象的wait()方法,把锁释放出来,让其他想进入synroized的线程获得运行的机会。当其他线程运行的差不多了,可以调用notify()方法,唤醒其他等待线程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值