多线程

什么是线程什么是进程

进程是程序的执行实例,一个进程中包含多个线程。例如:一个程序的运行就是一个进程,线程是一个最小的一个运行单元。

使用多线程是为了提高系统的响应速度。

什么是线程

一个程序里不同的执行路径就是线程

 

 

线程实现的方法

thread继承实现、实现runnable接口,java1.5之后实现callbale接口实现带返回值的接口

他们都是调用start 而不是调用run。

调用start是线程调用,调用run是方法调用,执行顺序就是按顺序执行,而调用start是执行线程一个一个执行

线程启动的三种方式:

1、thread,2、runnable,3、Executors。newCatchedThread:在线程池中启用线程

 

线程的生命周期/运行状态

new :新建状态,还没有调用start方法,线程处于新建状态

runnable:就绪状态,线程调用完start方法之后就进入就绪状态,等待CPU资源,处于就绪状态的线程由java运行时系统的线程调度程序来调度

running 运行状态,就绪的线程获取到CPU执行权之后就进入运行状态,开始执行run方法

blocked:阻塞状态,线程没有执行完,由于某种原因让出CPU执行权,自身进入阻塞状态,

dead:死亡状态,线程执行完或者执行过程中出现异常。

线程之间的协作

wait

当前的线程挂起,进入阻塞状态,notify 或者 notifyAll方法唤醒线程。

方法有wait(long tlimeout)在时间内没有notify或者notifyAll唤醒,会自动唤醒。与wait()一样,wait()与wait(0)一样

wait方法使用必须是在同步的范围内,否则会抛出IllegalMonitorStateException异常。

1.调用wait方法后,线程是会释放对monitor对象的所有权的。

2.一个通过wait方法阻塞的线程,必须同时满足以下两个条件才能被真正执行:

notify/notifyAll

wait是通过对象的monitor实现的,只要在同一个对象上调用notify或者notifyAll,就可以唤醒对应的monitor对象上的等待线程

1.调用wait方法后,线程是会释放对monitor对象的所有权的。

2.一个通过wait方法阻塞的线程,必须同时满足以下两个条件才能被真正执行:

  • 线程需要被唤醒(超时唤醒或调用notify/notifyll)。

  • 线程唤醒后需要竞争到锁(monitor)。

sleep

sleep是当前线程暂停指定的时间,与wait的区别是wait方法依赖于同步,sleep方法可以直接调用。wait需要释放锁,sleep只是暂时的让出CPU,不会释放锁

sleep与wait区别

sleep方法是是先暂停,程序顺序进入同步块,当上一个线程执行完之后下一个线程再执行,sleep暂停期间一直持有monitor对象锁,,其他线程是不能进入的

wait是当前线程会释放持有的monitor对象锁,因此,其他的线程可以进入同步方法,线程唤醒之后需要竞争锁,待到锁之后继续执行。

yield

暂停当前线程,一遍其他的线程有机会执行,不能执行时间也不能保证当前线程马上停止,yield只是将Running状态转为Runnable状态。

join

父线程等待子线程执行完之后再执行。就是说将异步执行的线程合并为同步线程执行。也就是说t1线程join t2线程就是等待t2线程执行结束之后t1线程再执行

join只是调用了wait方法,没有对应的notify方法是因为thread的start做了相应的处理,join线程执行完之后会自动唤醒主线程继续往下执行。

run与start区别

r

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值