多线程 -- 移动文件(生产者,消费者模式应用)

来源:互联网 发布:麦萌猫软件下载 编辑:程序博客网 时间:2024/06/05 20:54

期待实现的效果:

  • Thread producer 负责向 某文件夹 (GEXF_DIR)中写文件。(从ORIGIN_DIR 移动到 GEXF_DIR)
  • Thread consumer 负责从GEXF_DIR中取出数据到GEXF_SAVED_DIR中。


整体示意图如下:


Thread producer中的流程:


Thread consumer 流程图如下:



代码如下:

package tree.test.testThread;import java.io.File;import tree.utils.FileUtils;public class TestFileMove {public final static String ORIGIN_DIR = "test/dirTest/";public final static String GEXF_DIR = "test/dirTest/gexf_files/";public final static String GEXF_SAVED_DIR = "test/dirTest/gexf_saved/";private static File gexfFiles;private static boolean isFinished = false;public static void main(String[] args) {File gexfDir = new File(GEXF_DIR);Consumer consumer = new Consumer();consumer.setGexfFiles(gexfDir);Producer producer = new Producer();producer.setGexfFiles(gexfDir);isFinished = false;new Thread(producer).start();new Thread(consumer).start();System.out.println("main ended `````");}static class Consumer implements Runnable {private File dir;public void run() {while (!isFinished) {synchronized (dir) {// TODOFile files[] = dir.listFiles();for (int i = 0; i < files.length; i++) {if (FileUtils.isRequiredExtention(files[i].getName(), ".gexf")) {FileUtils.moveFileToAnother(files[i], GEXF_SAVED_DIR);}}}try {Thread.sleep(500);Thread.yield();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("consumer ended `````");}public void setGexfFiles(File gexfDir) {dir = gexfDir;}}static class Producer implements Runnable {private File dir;public void run() {// TODOFile originDir = new File(ORIGIN_DIR);File files[] = originDir.listFiles();for (int i = 0; i < files.length; i++) {synchronized (dir) {if (FileUtils.isRequiredExtention(files[i].getName(), ".gexf")) {FileUtils.moveFileToAnother(files[i], GEXF_DIR);}}try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}isFinished = true;System.out.println("producer ended `````");}public void setGexfFiles(File gexfDir) {dir = gexfDir;}}}


0 0
原创粉丝点击