|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一生产与一消费:操作栈
P1生产一个,C1消费一个 容器size的值不会大于1
一生产与多消费:操作栈
注意判断状态的语句 将if改成while 则可以运行
但是因为多消费者,用notify()通知 会出现假死现象
改成notifyAll();则不会出现假死现象
多生产与多消费:操作栈
通过管道进行线程间通信:字节流
管道流pipeStream 是一种特殊的流,用于在不同线程间直接传送数据
一个线程发送数据到输出管道,另一个线程从输入管道中读数据
JDK中提供了四个类使进程间可以进行通信
PipedInputStreadm PipedOutputStream
PipedReader PipedWriter
PipedInputStream和PipedOutputStream的实现原理类似于“生产者-消费者”,
PipedInputStream是消费者,该类中有有一个buffer字节数组,默认为1024,作为缓冲区,存放“生产者”生产出来的东西,
还有两个变量int,out in记录“生产者”生产了多少,out记录“消费者”消费了多少,当in为-1时表示消费完了,in==out时表示生产满了
有int read(byte[] b, int off, int len)将最多len个数据字节从此管道输入流读入byte数组
也有clsoe()
PipedOutputStream 是生产者,有write(byte a)将指定a写入传送的输出流,
close()关闭此管道输出流并释放与此流有关的所有系统资源
实战:等待/通知交叉备份
方法join的使用
作用:等待线程对象销毁 很多情况下,主线程创建并启动子线程,通常主线程比子线程更早结束 如果主线程想等待子线程执行完毕后再结束,使用join方法
属于Thread类的方法
join() 等待该线程终止
join(long millis) 等待millis时间终止线程
join(long millis, int nanos) 等待 millis毫秒+nanos纳秒 时间终止
例如:t.join()
t.join()方法阻塞调用此方法的线程,直到线程t完成,此线程在继续;通常用于在main()主线程内,等待其他线程完成再继续main()主线程
Join方法实现是通过wait(小提示:Object 提供的方法)。 当main线程调用t.join时候,main线程会获得线程对象t的锁(wait 意味着拿到该对象的锁),调用该对象的wait(等待时间),直到该对象唤醒main线程 ,比如退出后。 这就意味着main 线程调用t.join时,必须能够拿到线程t对象的锁。
join方法是synchronized,所以需要获取Thread的对象锁才能进入,只有获得了锁才能调用wait放弃对锁的独占并等待再次获取锁。
|
评分
-
查看全部评分
|