如何在多个线程上运行java程序

时间:2014-02-14 06:36:37

标签: java multithreading synchronization

下面是我从文本文件中提取文本并在控制台上显示文本的代码。

有人可以告诉我如何让这个程序同时在多个线程上运行吗?

我还想知道在执行任务时是否使用了多个线程,因为每次运行时运行任务所需的时间都会有所不同。??

    //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");
             }
           }
         }

1 个答案:

答案 0 :(得分:2)

由于不可避免的输入/输出(I/O)瓶颈导致多个线程从同一个文件读取,因此在性能方面没有多大意义。

可以采取两项措施来改善这种状况:

  1. 将文件“拆分”成更小的片段并将每个这样的“拆分”分配给不同的线程。这是Hadoop所遵循的方法,但它确实需要在处理之前复制每个“拆分”,因此它仅对大文件有用(例如,每个文件至少100 MB,或更多)。
  2. 使用1个线程从文件中读取内存中的“预取”缓冲区,然后通过多个其他线程处理来自缓冲区的输入。这种方法的一种变体是预取线程在每个“消费者”线程开始之前用数据“馈送”每个“消费者”线程。显然,预取与线程间处理的相对分配将产生不同的结果,因此需要进一步调整,具体取决于应用程序。
  3. 这两种方法都有局限性,并不能保证在所有情况下都能提高性能。

    从单个线程逐行读取文本文件可以超过100万行/秒的速度完成,但瓶颈仍然会保留在I/O中,如前所述。