以List集合模拟栈,限制为栈的容量是否为1(最大值为1),进行生产/消费。
变形五:一生产与多消费——操作栈:解决wait条件改变与假死。同上例的基础条件,但是消费者变为多个。
解决条件改变是将if改为while(这里还不太明白),解决假死是将notify()改为notifyAll()。
变形六:多生产与一消费:操作栈 变形七:多生产与多消费:操作栈六和七,在解决条件改变与假死之后,只需修改执行方法就ok,说明,生产者与消费者模型中目前出现的问你就是通过这两个方式来解决的。
注:wait条件改变:while()替代if(),假死:notifyAll()替代notify()
java中有各种各样的输入/输出流Stream,使我们能够很方便的对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用在不同管道间直接传送数据。
一个线程发送数据到输出管道,一个线程从输入管道接收数据。通过不同线程间的管道通信,而无须借助于类似临时文件之类的东西。
四种管道流:
1)PipedInputStream/PipedOutputStream
2)PipedReader/PipedWriter
使用流的new PipedInputStream().connect(new PipedOutputStream)或者:new PipedOutputStream().connect(new PipedInputStream())。可以实现Stream之间的通信链接。
注:当读取的数据没有值时,会阻塞,知道数据被写入之后才会继续运行。
与上面的例子是一致的(流不一样)。
要求:
创建20个线程,十个线程将数据备份到数据库A,十个线程将数据备份到数据库B,且备份A与备份B是交叉进行的。同时还要求有序。
数据库代码:
public class DBTools { volatile private boolean prevIsA = false; synchronized public void backupA() { try { while (prevIsA == true) { wait(); } for (int i = 0; i < 5; i++) { System.out.println("☆☆☆☆☆"); } prevIsA = true; notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } synchronized public void backupB() { try { while (prevIsA == false) { //用while代替if防止出现条件改变的情况 wait(); } for (int i = 0; i < 5; i++) { System.out.println("*****"); } prevIsA = false; notifyAll(); //用notifyAll()替换notify()防止出现“假死” } catch (InterruptedException e) { e.printStackTrace(); } } }