清除java应用程序的缓存

时间:2012-07-05 08:24:31

标签: java caching audio javasound

我正在尝试编写一个程序,用于检测耳机何时插入系统,然后在取下耳机时运行另一段代码。代码工作正常,但我面临的问题是设备的状态正在缓存,因此我拉出耳机后1分钟我的程序检测到它已被删除。 当我运行代码是一个无休止的循环时,会发生这种情况。

但是如果我不在循环中运行单个实例,它会立即在运行中显示正确的状态

这是代码:

        public class Headphonecheck {

             public static int hpfound = 0;
             public static int hpnfound =0;

             public static void isHeadphoneAvailable() {
                while (true)
                    {
                  if     (!AudioSystem.isLineSupported(Port.Info.HEADPHONE) && hpnfound ==0) {
                        System.out.println("NO HEADPHONE FOUND");
                       System.out.println("Do something else");
                       hpfound = 0;
                       hpnfound = 1;

                    } else {
                    if(AudioSystem.isLineSupported(Port.Info.HEADPHONE) && hpfound ==0){
                       System.out.println("HEADPHONE FOUND");
                       System.out.println("Do something");
                       hpnfound = 0;
                       hpfound =1;
                    }
                }

                } //close while

            }

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

如果你删除while循环并运行代码它完全适合单次运行..即你插入耳机并运行代码它显示HEADPHONE FOUND然后当你删除耳机并运行代码它显示没有耳机找到。

在while循环中,如果你有耳机进入并运行代码它会显示HEADPHONE FOUND,然后如果你立即移除耳机,则需要大约50秒来显示没有耳机找到。这是因为它将缓存50秒然后清除缓存

如何阻止缓存或清除缓存

2 个答案:

答案 0 :(得分:0)

你的目标潜伏期是什么?

你可以设置重复的“单次运行”吗? (例如,通过计时器?)

我希望while循环连续运行一个“切片”,并让它的响应与“切片”的大小和间距有关。但是线程通常不会提前50秒运行!即使50毫秒也有点过分。所以这不能解释你所获得的缓存量。

在任何情况下,像cpu一样运行while循环对于不经常发生的事件而言似乎很昂贵,并且可能仅需要50毫秒的精度? (目前,while循环正在测试连续的微秒甚至纳秒,而不是一个高支付测试。)每50毫秒重复一次轮询的Timer循环应该可以更好地利用资源。

另外一个注意事项,如果你采用Timer路由:ScheduledThreadPoolExecutor被吹捧为优于util.Timer,并且在Java 1.5及更高版本中被优先考虑,Goetz / Bloch / Lea /其他人在“Java Concurrency in Practice”中”。他们说它在处理未经检查的异常方面做得更好。

另一种可能性:在你的while循环中放置一个Thread.sleep(50)或某些值,这可能与使用TimerTasks相当。

我不能肯定这会解决这个问题,但至少“缓存”不会因此而变得如此之大,而且性能总体上会略有改善。

答案 1 :(得分:0)

好像你需要添加一个事件监听器。您并不想循环查找此信息,您希望在更改时收到通知。我以前没有亲自使用过这个系统,但看起来Line界面允许你为事件添加一个LineListener。

代码看起来像这样:

...

if(AudioSystem.isLineSupported(Port.Info.HEADPHONE) && hpfound ==0){ 
  Line line = AudioSystem.getLine(Port.Info.HEADPHONE);
  line.addLineListener(new LineListener() {
       public void update(LineEvent event) {
         switch (event.getType()) {
           CLOSE: doSomethingOnClose();
           STOP: doSomethingOnStop();
           // etc...
         }
       }
     });
}

...