2014-03-07 29 views
0

请看下面的代码。一旦线程完成,文本就不会被打印

public class BigFileWholeProcessor { 
    private static final int NUMBER_OF_THREADS = 2; 
    public void processFile(String fileName) { 

     BlockingQueue<String> fileContent = new LinkedBlockingQueue<String>(); 
     BigFileReader bigFileReader = new BigFileReader(fileName, fileContent); 
     BigFileProcessor bigFileProcessor = new BigFileProcessor(fileContent); 
     ExecutorService es = Executors.newFixedThreadPool(NUMBER_OF_THREADS); 
     es.execute(bigFileReader); 
     es.execute(bigFileProcessor); 
     es.shutdown(); 

     if(es.isTerminated()) 
     { 
      System.out.println("Completed Work"); 
     } 

    } 
} 



public class BigFileReader implements Runnable { 
    private final String fileName; 
    int a = 0; 
    public static final String SENTINEL = "SENTINEL"; 

    private final BlockingQueue<String> linesRead; 
    public BigFileReader(String fileName, BlockingQueue<String> linesRead) { 
     this.fileName = fileName; 
     this.linesRead = linesRead; 
    } 
    @Override 
    public void run() { 
     try { 
      //since it is a sample, I avoid the manage of how many lines you have read 
      //and that stuff, but it should not be complicated to accomplish 
      BufferedReader br = new BufferedReader(new FileReader(new File("E:/Amazon HashFile/Hash.txt"))); 
      String str = ""; 

      while((str=br.readLine())!=null) 
      { 
       linesRead.put(str); 
       System.out.println(a); 
       a++; 
      } 
      linesRead.put(SENTINEL); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     System.out.println("Completed"); 
    } 
} 



public class BigFileProcessor implements Runnable { 
    private final BlockingQueue<String> linesToProcess; 
    public BigFileProcessor (BlockingQueue<String> linesToProcess) { 
     this.linesToProcess = linesToProcess; 
    } 
    @Override 
    public void run() { 
     String line = ""; 
     try { 
      while ((line = linesToProcess.take()) != null) { 
       //do what you want/need to process this line... 

       if(line==BigFileReader.SENTINEL) 
       { 
        break; 
       } 
       String [] pieces = line.split("(...)/g"); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我想打印在BigFileWholeProcessor文本“已完成的工作”一旦所有线程的工作已经完成。但相反,它没有被印刷。为什么是这样?如何确定所有线程都已完成并需要打印?

+0

@Smutje:我不明白如何将这些答案映射到我的。 –

+0

你有一个执行者服务,你想等待所有执行的线程完成。只需检查第一个答案。 – Smutje

+0

@Smutje:我做到了。我从来没有与这个执行者合作过,我不明白如何将它应用到这里。你是否提供解决方案? –

回答

0

shutdown()方法仅信号ES到关机,则需要

awaitTermination(长超时,TIMEUNIT单元)

打印消息之前

0

使用submit()方法代替​​。如果您想等待线程在任何时间点完成,则可以使用get()方法。请阅读有关使用Future对象的文档以获取更多详细信息。

ExecutorService es = Executors.newFixedThreadPool(2); 
Future<?> f = es.submit(new Thread(new TestRun())); 
f.get(); // Wait for result... (i.e similar to `join()` in this case) 
es.shutdown(); // Shutdown ExecutorService 
System.out.println("Done."); 

我已经定义了一个TestRun类实现Runnable,这里没有显示。在其他情况下,Future对象更有意义。

相关问题