【问题标题】:How to show progress during an IO operation如何在 IO 操作期间显示进度
【发布时间】:2012-10-20 22:53:00
【问题描述】:

我想从数组中读取元素并将读取进度显示为并行进程读取。

我有两个内部类:

public class NumbersCounter {

    int totalCountOfLines;
    int currentCountOfLines = 1;

    public NumbersCounter() throws FileNotFoundException, IOException {    
        new Read();
        new Progress();
    }

    public static void main(String[] args) {
        try {
            new NumbersCounter();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(NumbersCounter.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(NumbersCounter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    class Progress extends Thread {  
        public Progress() {
            start();
        }

        @Override
        public void run() {        
            synchronized(new Object()) {
                while (currentCountOfLines <= totalCountOfLines) {
                    System.out.println(currentCountOfLines / totalCountOfLines * 100 + "%");
                    Thread.yield();
                }            
            }
    }}

    class Read extends Thread {
        private FileHandler fh = new FileHandler("ololo.txt");
        private String[] lines;

        public Read() throws FileNotFoundException, IOException {
            this.lines = fh.readFromFile();
            start();
        }

        @Override
        public void run() {

            totalCountOfLines = this.lines.length;

            if (totalCountOfLines > 0) {
                synchronized(new Object()) {
                    for (String line : lines) {
                        currentCountOfLines++;   
                        Thread.yield();
                    }

                }
            } else {
                totalCountOfLines = 0;
            }    
        }
    }
}

当执行Read Thread的第一步时,我需要给Progress线程执行,然后是Read,然后是Progress。

【问题讨论】:

    标签: java file-io progress


    【解决方案1】:

    使用javax.swing.ProgressMonitorInputStream 类作为输入流的包装器,显示进度对话框。

    【讨论】:

      【解决方案2】:

      请参阅 java.util.concurrent 包的文档。

      http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/package-summary.html

      特别是 ExecutorService、Executor、Callable 和 Future 接口。并发包旨在完成您尝试做的事情,而无需您自己处理锁定和并发。

      后台 IO 操作 - 逐步更新 UI。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多