我正在处理一个巨大的数据文件,因为"发布在"下面,我在一个单独的线程上阅读它。在主线程中,我想检索某些文件,例如logFile.getFileHash.getTimeStamp
,以便在该timeStamp上执行某些操作。我面临的问题是,只有当我的文件在另一个线程中被完全读取时,如何从主线程中的文件中读取一些数据?
注意:我不想对从读取文件的同一线程上的文件中检索到的数据执行操作,我想在主线程上执行此操作。
示例
public static void main(String[] args) throws IOException {
//fileThread.start(); will take 8 seconds.
/*
*here i want to read some data from my file to perform some processing but only
*when the thread that handles reading the file finishes work.
}
文件
private static void processFile(File dataFile) throws IOException {
// TODO Auto-generated method stub
MeasurementFile logfile = new MeasurementFile(dataFile);
System.out.println(logfile.getTotalLines());
System.out.println(logfile.getFileHash().get(logfile.getTotalLines()).getFullParameters().length);
System.out.println(logfile.getFileHash().get(logfile.getTotalLines()).getEngineSpeed());
}
答案 0 :(得分:1)
尝试使用CountDownLatch等待读者完成:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
答案 1 :(得分:1)
Thread.join可以适合这种情况。
public static void main(String[] args) throws IOException {
fileThread.start();
fileThread.join();
//..now this thread blocks until *fileThread* exits
}
答案 2 :(得分:0)
我不确定我是否理解这个问题,但是我认为你试图让主线程在子线程完成读取之后读取相同的文件而不结束子线程。如果是这样,那么你可以创建一个同步的readMyFile(文件文件)方法,任何线程都可以用来读取任何文件,当然要确保子线程首先读取文件。
答案 3 :(得分:0)
很抱歉迟到的回复。
如果我认为是正确的那么你可以做这样的事情,粗略......
public static void main(String args[]) {
...
fileThread.start();
synchronized (fileThread) {
try{
fileThread.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
...
MyReader.readMyFile(file);
...
}
...而fileThread线程类就像......
class FileThread extends Thread {
public void run() {
synchronized (this){
...
MyReader.readMyFile(file);
notify();
...
}
}
这是一种方式。我希望它有所帮助。
答案 4 :(得分:-1)
在文件线程中添加一个属性,为它添加一个公共getter。当该线程完成时,将isFinished的值更改为true;
private boolean finished = false;
public isFinished(){...}
在你的主线程中,只需将其休眠并恢复它以检查文件线程是否已完成:
public static void main(String[] args) throws IOException {
...
fileThread.start();
...
while(!fileThread.isFinished()){
try{
Thread.sleep(1000);//1 second or whatever you want
}catch(Exception e){}
}
//Do something
....
}