我正在处理一个巨大的数据文件,如"发布在下面",我在单独的线程上读取它。在主线程中,我想检索该文件的一些数据,例如logFile.getFileHash.getTimeStamp
对该时间戳执行一些操作。我面临的问题是,只有当我的文件在另一个线程中完全读取时,如何开始从主线程中的文件中读取一些数据?
注意:我不想在读取文件的同一线程上对从文件中检索的数据进行操作,我想在主线程上执行此操作。
例
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());
}
尝试使用 CountDownLatch 等到阅读器完成:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
Thread.join 可以满足这个要求。
public static void main(String[] args) throws IOException {
fileThread.start();
fileThread.join();
//..now this thread blocks until *fileThread* exits
}
我不确定我是否理解这个问题,但我认为您正在尝试在子线程完成读取后使主线程读取相同的文件而不结束子线程。如果是这样,那么您可以创建一个同步的readMyFile(File file)方法,任何线程都可以使用它来读取任何文件,当然要确保子线程首先读取文件。
抱歉回复晚了。
如果我假设是正确的,那么你可以做这样的事情,大致......
public static void main(String args[]) {
...
fileThread.start();
synchronized (fileThread) {
try{
fileThread.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
...
MyReader.readMyFile(file);
...
}
。和文件线程线程类的东西作为...
class FileThread extends Thread {
public void run() {
synchronized (this){
...
MyReader.readMyFile(file);
notify();
...
}
}
这是一种方式。我希望它有所帮助。
在文件线程中添加一个属性,并为它添加一个公共 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
....
}