(危险的问题,我希望当我遇到这个问题时答案已经在线)
使用Java 1.4,我有一个方法,我想在某些时候作为一个线程运行,但不是在其他人.所以我将它声明为Thread的子类,然后根据我的需要调用start()或run().
但我发现我的程序会随着时间的推移泄漏内存.我究竟做错了什么?
这是Java 1.4中的一个已知错误:http://bugs.sun.com/bugdatabase/view_bug.do; jsessionid = 5886e03fee226ffffffffc40d4fa881a86e3: WuuT?bug_id = 4533087
它已在Java 1.5中修复,但Sun并不打算在1.4中修复它.
问题是,在构造时,a Thread
被添加到内部线程表中的引用列表中.在start()方法完成之前,它不会从该列表中删除.只要该引用存在,就不会收集垃圾.
所以,永远不要创建一个线程,除非你肯定会调用它的start()
方法.一个Thread
对象的run()
方法,不应该被直接调用.
编写代码的更好方法是实现Runnable
接口而不是子类Thread
.当您不需要线程时,请致电
myRunnable.run();
当你需要一个线程时:
Thread myThread = new Thread(myRunnable); myThread.start();