下面是我从文本文件中提取文本并在控制台上显示文本的代码。
有人可以告诉我如何让这个程序同时在多个线程上运行吗?
我还想知道在执行任务时是否使用了多个线程,因为每次运行时运行任务所需的时间都会有所不同。??
//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");
}
}
}
答案 0 :(得分:2)
由于不可避免的输入/输出(I/O
)瓶颈导致多个线程从同一个文件读取,因此在性能方面没有多大意义。
可以采取两项措施来改善这种状况:
Hadoop
所遵循的方法,但它确实需要在处理之前复制每个“拆分”,因此它仅对大文件有用(例如,每个文件至少100 MB,或更多)。这两种方法都有局限性,并不能保证在所有情况下都能提高性能。
从单个线程逐行读取文本文件可以超过100万行/秒的速度完成,但瓶颈仍然会保留在I/O
中,如前所述。