2014-02-14 96 views
0

下面是我的代码,用于从文本文件中提取文本并将其显示在控制台上。如何在多线程上运行java程序

请问有人能告诉我怎样让这个程序同时在多个线程上运行吗?

我也想知道是否有多个线程在执行任务时使用,因为运行任务所花费的时间在每次运行时都会发生变化。

//Code  
    import java.io.*; 
    import java.util.*; 


    class Extract{ 
    static int i=0; 
    FileInputStream in; 
    BufferedReader br; 
    ArrayList<String> stringList; 
    String li; 


    Extract() throws FileNotFoundException 
    { 
    FileInputStream in = new FileInputStream("C:\\Users\\sputta\\workspace\\Sample\\src\\threads.txt"); 
    br = new BufferedReader(new InputStreamReader(in)); 
    stringList = new ArrayList<String>(); 
    li=" "; 
    } 

    void call() 
    { 
    try{ 
    while(li!=null) 
    { 
    String str = br.readLine(); 
    stringList.add(str); 
    li=stringList.get(i); 
    if(li!=null) 
    { 
    System.out.println(li); 
    i++; 
    } 
    } 
    Thread.sleep(1000); 
    in.close(); 
    } 

    catch(Exception e) 
    { 
    System.out.println(e); 
    } 
    } 
    } 

    class Caller implements Runnable { 

     Extract target; 
     Thread t; 
     public Caller(Extract targ) 
     { 
     target = targ; 
     t = new Thread(this); 
     t.start(); 
     System.out.println(t.isAlive()); 
     } 

     public void run() 
     { 
     synchronized(target) { // synchronized block 
     target.call(); 
     } 
     } 
    } 

    public class Sample { 
     public static void main(String args[]) throws FileNotFoundException 
     { 
     long startTime = System.currentTimeMillis(); 
     System.out.println(startTime); 
     Extract target = new Extract(); 
     Caller ob1 = new Caller(target); 
     Caller ob2 = new Caller(target); 
     Caller ob3 = new Caller(target); 

     try { 
       ob1.t.join(); 
       ob2.t.join(); 
       ob3.t.join(); 
       } 

     catch(InterruptedException e) 
      { 
       System.out.println("Interrupted"); 
      } 
      } 
     } 
+4

阅读Java教程:http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html – 2014-02-14 06:37:43

+2

你想读取来自不同线程或单个文件的多个文件吗?如果它是单个文件,那就更困难了,并且由于IO限制而不可能提供任何性能改进。 –

+1

这样做的最终目标是什么? – seand

回答

2

它没有多大意义的性能,明智的,有多个线程从同一文件读取,由于不可避免的输入/输出(I/O)瓶颈。

有两件事情可以做,以改善情况:

  1. “拆分”的文件成小块,并指定每个这样的“分裂”,以不同的线程。这是Hadoop之后的方法,但它确实需要在处理之前复制每个“分割”,因此它只对大文件(比如每个至少100 MB或更多)有利。
  2. 使用1个线程从文件读取到内存中的“预取”缓冲区,然后通过多个其他线程处理来自缓冲区的输入。这种方法的一个变种是预取线程在每个线程开始之前用数据“提供”每个“消费者”线程。显然,线程间预取与处理的相对分配会产生不同的结果,因此根据应用程序的不同,进一步的调整将是必要的。

这两种方法都有局限性,并不能保证在所有情况下的性能改进。如上所述,可以以超过100万行/秒的速度逐行读取文本文件,但仍然存在瓶颈问题,如I/O

+0

我会补充一点,“分裂”技巧只有在分割是通过不同的硬件进行时才有用!在同一块硬盘上没有任何分歧。 – C4stor

+0

正确,除非您将每个拆分复制到一个单独的文件,这(如前所述)仅对大文件有意义。 :-) – PNS