网上看到很多观察者模式都是偏理论而且给出的实例只能刚讲清楚观察者模式,没有触及实际的需求。最近,要写一个多线程拷贝目录的工具,这是因为传统的cp都是单线程的,对于文件很大,很多显然效率很低。
闲话少叙,开始,思路其实很清楚,由于拷贝是A-B的动作,要用多线程:
1、一组多线程不断取得源目录的文件,经过简单的路径调整得到目标文件路径,然后将源文件路径和目标文件路径分送到源文件池和目标文件池。
2、另一组多线程实时地观察源文件池或目标文件池是否为空,如果为空就等待,如不为空就从源文件池和目标文件池中取文件路径后拷贝。
这样就是一个观察者模式的变种。
被观察者是1,控制多线程取文件路径,后分送到线程池。
观察者是2,实时观察文件池中是否有文件,如何有就控制将文件从源文件路径拷贝到目标文件路径。
讨论:
1、观察者如何知道文件池不会再有文件了,两种方法,1、全局变量做标记。2、线程池中首先放一个标志。表示线程池是否为空。
2、如果某个源文件很大,显然一个线程将长期在拷贝一文件,这显然在效率上就打个问号了。所以,拷贝文件过程中,又要让读文件和写文件都为多线程。
3、线程池的大小,是需要控制的,比如有100万个文件,池过大也会引起问题。所以被观察者控制线程池的大小。当然让池的数量和线程的数量一致,这样可以增加处理文件的能力。问题也没有过度复杂化,也是可以考虑的。
4、为了让每个线程都能取到正确的路径,文件池是一个栈,栈底存放是否还有文件的标志。
5、也许可以用全局变量,但是这里有一个问题:如果我 要同时做10个不同的拷贝动作,这样就存在问题了。
6、如果能让线程的数量随需要变化,那就更好了,比如,我现在开了10个线程,每个线程的池都满了,我可以继续增加线程数量,类似vector的思想。
7、其实发现,如果拷贝实现的化,顺便mv也实现啦。。。ls也实现了。。。
暂且讨论至此。有兴趣的自己操作下~~考察你对多线程和观察者模式的理解。何乐而不为?