在java中用线程显示忙状态

时间:2011-04-05 18:44:46

标签: java multithreading

我正在编写一个Java应用程序,它写入excel表数据集,这需要一段时间才能完成。

我想在你安装东西的时候创建像在Linux上一样写出点的东西。

这有可能在java?打印点,而其他线程实际上写入excel,然后在它完成后,一个显示点也退出?

我想打印点到控制台。

4 个答案:

答案 0 :(得分:2)

@John V.的一个变体是使用ScheduledExecutorService:

// SETUP
Runnable notifier = new Runnable() {
    public void run() {
        System.out.print(".");
    }
};

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

// IN YOUR WORK THREAD
scheduler.scheduleAtFixedRate(notifier, 1, 1, TimeUnit.SECONDS);
// DO YOUR WORK
schedule.shutdownNow();

修改通知程序对象以满足您的个人需求。

答案 1 :(得分:0)

很有可能。使用newSingleThreadExecutor打印点,而另一个线程进行解析。例如

ExecutorService e = Executors.newSingleThreadExecutor();
Future f = e.submit(new Runnable(){
   public void run(){
       while(!Thread.currentThread().isInterrupted()){
          Thread.sleep(1000); //exclude try/catch for brevity
          System.out.print(".");
       }
   }
});
//do excel work
f.cancel(true);
e.shutdownNow();

答案 2 :(得分:0)

是的,有可能,您可能希望让您的工作线程设置一个变量,以指示它正在工作以及何时完成。然后通过扩展Thread类或实现Runnable接口来创建线程。这个线程应该无限循环,在这个循环中它应该做你想要它做的任何打印,然后检查变量以查看工作是否完成。当变量值改变时,打破循环并结束线程。

一个注意事项。观察您的处理速度。如果您的处理器使用率很高,请在循环中使用Thread.sleep()。这个帖子不应该是劳动密集型的。 System.gc()是让线程等待的另一种流行方式。

答案 3 :(得分:0)

不是一个优雅的解决方案,但完成工作。它在循环中打印1,2,3,1,2 ......点,并在5秒后终止所有内容。

public class Busy {

    public Busy() {
        Indicator i = new Indicator();
        ExecutorService ex = Executors.newSingleThreadExecutor();
        ex.submit(i);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        i.finished = true;
        ex.shutdown();
    }

    public static void main(String[] args) {
        new Busy();
    }

    private class Indicator implements Runnable {

        private static final int DOTS_NO = 3;
        private volatile boolean finished = false;

        @Override
        public void run() {
            for (int i = 0; !finished; i = (i + 1) % (DOTS_NO + 1)) {
                for (int j = 0; j < i; j++) {
                    System.out.print('.');
                }
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int j = 0; j < i; j++) {
                    System.out.print("\b \b");
                }
            }
        }

    }

}