线程间通信

wait等待和notify唤醒机制

使用wait方法需要在同步方法内,换句话说就需要在synchronized关键字的方法里面。wait方法是通过object调用的,而object就是synchronized上锁的东西。如果不在对象级别的锁内进行调用会抛出异常。

wait和suspend

wait方法与suspend方法有共同的点。wait为等待suspend为暂停,当运行到该方法时,线程将会停止往下运行,进入阻塞状态。但是wait方法会将自己获得的锁资源释放掉,而suspend则不会,容易导致死锁,需要尽量避开使用该方法。

当调用wait方法使线程进入等待状态的时候需要调用notify方法将其唤醒。同样的,notify方法也需要在在同步方法内,调用notify方法后只可以唤醒一个相同对象的wait,notify只会唤醒等待队列中的第一个线程,而其他线程不会被唤醒。被唤醒的线程不会直接得到锁的资源,因为现在的锁还在notify所在的synchronized中,所以需要等到notify所在的代码块运行结束释放锁资源以后才会轮到被唤醒的线程继续运行,并且会把资源优先给他。如果调用的是notifyAll方法则会将该对象所有wait的线程全部唤醒,但是他们也不会异步运行,他们会抢夺锁资源,最后只有一个线程会获取资源并且开始运行。

线程之间的通讯,利用管道

在多线程中,多线程之间的通信可以借用管道,一个线程将数据发送至输出管道,另一个线程从输入管道中读取数据。PipedInputStream和PipedOutStream(字节流管道)、PipedRead和PipedWrite(字符流管道)。管道之间用.connect进行连接。http://blog.csdn.net/zlp1992/article/details/50298195

join与yield与sleep

join()的作用与yield()方法正好相反,join()的作用是当有多个线程时,先执行join()当jion()结束才能去执行其他线程。

join(time) 和sleep(time)的方法有相似。join(time)的意思就是"我停下time的时间让别人先去执行",而sleep(time)是"我要停下time的时间,所有人和我一起休息吧"。值得注意的是,join(time)往往会首先抢到锁的资源,然后释放掉,等时间到了,在回到之前运行的地方继续执行。

线程自己的存储空间-ThreadLocal

ThreadLocal可以储存线程自己的私有数据,通过set和get方法进行设置和获取。如果ThreadLocal没有设置过初始值的话获取数来的将会是null。设置初始值可以通过重写initialValue来设置初始值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值