`
agile_boy
  • 浏览: 558151 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA线程误区:Thread不能随便使用

    博客分类:
  • java
阅读更多
  工作原因,需要找出程序中内存泄漏的地方(泄漏现象:JAVA进程的内存,一直在缓慢的增长,到最后出现OutOfMemory),当然市场上有很多的这样剖析工具了象Jprobe等,但是因为商业原因,没能采用:(.
  于是就用java本身的-Xrunhprof参数+HPjmeter,进行剖析,经过跟踪分析,发现有大量的Thread一直是活动对象,及时run()已经执行过!类似代码如下:
 
  Vector v = new Vector();
  for (int k=0;k<10;k++)
    v.addElement(new Thread());

  ....//other somethings.
  for (int k=0;k<v.size();k++) {
    Thread  t= (Thread)v.elementAt(k);
    t.run();
    v.removeElementAt(k);
   }

   将heap=dump参数打开,用HPjemter分析prof文件日志,发现Thread对象,一直还是活动的,并且监测到memory leak.
   我们再来看看代码,把Thread放到一个类似的队列里边去,然后执行,最后从队列移出,看似没有什么问题,其实这就是Thread滥用的地方.如果开始一个Thread,只是为了运行run方法,而不需要start,那就将Thread换成Runnable对象好了,那么内存泄漏的机会就没有了.
   而且此泄漏跟JDK版本也有关系的,我在JDK5上运行以上代码,就没有监测到泄漏,而在1.4和1.3上,这样的泄漏就一直存在.!
   最后,建议创建线程,最好还是用JDK推荐的Runnable方式.!
分享到:
评论
2 楼 agile_boy 2008-12-31  
以上代码,是别人的一段有问题的代码
1 楼 bokix 2008-12-30  
线程的启动不是应该是:t.start()吗?你的代码里怎么是t.run()?????

相关推荐

    JAVA 多线程的两点误区

    - Java线程有优先级的概念,可以通过`setPriority()`方法设置线程的优先级。优先级高的线程在调度时更有可能被选中执行。但是这并不保证高优先级线程一定会先于低优先级线程执行,因为线程调度最终还是由操作系统...

    java中ThreadLocal类的使用

    - **代码可读性和可维护性**:`ThreadLocal`的使用可能使代码变得复杂,不易于理解和调试,尤其是在多线程环境下的问题排查。 总结,`ThreadLocal`是Java中用于实现线程局部变量的工具,它提供了一种简单的方式在多...

    Java并发编程笔记

    在Java中,线程具有多种状态,这些状态的变化反映了线程在其生命周期中的不同阶段。理解这些状态及其转换对于编写高效、健壮的并发程序至关重要。 - **NEW**:表示一个还未启动的新线程。当创建一个`Thread`实例后...

    Java学习路线实战版

    2. **线程创建**:通过Thread类和实现Runnable接口创建线程。 3. **线程同步**:学习synchronized关键字,死锁、活锁、饥饿问题,以及wait()、notify()和notifyAll()方法。 4. **线程池**:使用ExecutorService和...

    Java陷阱一箩筐.doc

    21. **abstract method**:不能同时是 static、native、synchronized。 22. **接口继承与实现**: - 接口可以继承其他接口。 - 抽象类可以实现接口。 - 抽象类可以继承普通类。 23. **启动线程**:使用 `start...

    Java面试解惑系列

    5. **多线程**:了解线程的创建方式(Thread类、Runnable接口)、线程同步机制(synchronized、volatile、Lock接口),以及线程池的使用。 6. **JVM**:JVM的工作原理,类加载机制(双亲委派模型),字节码执行引擎...

    java笔试面试题及答案.pdf

    线程的终止通常通过`Thread.stop()`(不推荐使用,因为不安全)、`Thread.interrupt()`、共享变量的检查等方式实现。 2. 构造函数的特性: 构造函数是类的一个特殊方法,其名称必须与类名相同(选项a正确),可以...

    《Java通用范例开发金典》一书的源代码(下)

    4. 多线程:Java提供了强大的多线程支持,这里的源代码可能包含Thread类和Runnable接口的实现,以及同步控制(如synchronized关键字、wait/notify机制)的实例,帮助读者理解和编写并发程序。 5. 网络编程:Java的...

    Handler与Android多线程详解

    1. **创建`Thread`对象并调用`start()`方法**:这是Java中标准的多线程实现方式。在`run()`方法中编写耗时操作,新线程会独立于主线程执行。 2. **使用`HandlerThread`**:`HandlerThread`是Android提供的一个特殊...

    JDK_API_1_6_zh_CN.CHM

    《JDK_API_1_6_zh_CN.CHM》文档的中文特性使得国内开发者能够更方便地查阅和理解Java API的使用,从而提高开发效率,避免因语言障碍产生的理解误区。这份文档是每个Java开发者必备的参考资料,无论初学者还是资深...

    SCJP大全

    6. **多线程**:学习线程的创建、同步与通信,包括Thread类、Runnable接口、synchronized关键字、wait()、notify()和notifyAll()方法的应用。 7. **输入/输出流**:了解I/O流的概念,包括文件流、字符流、缓冲流、...

    android教程

    在Android开发中,一个常见的误区是直接在非UI线程中调用UI组件的方法。例如,尝试直接在自定义线程中调用`invalidate()`方法以更新UI。虽然这种方法可能看似有效,但实际上违反了Android的单线程模型。所有UI操作...

    2021-2022计算机二级等级考试试题及答案No.1291.docx

    Java线程的创建 - **创建方式**: - 定义`Thread`类的子类并重写`run()`方法。 - 实现`Runnable`接口并实现`run()`方法。 - **区别**: - 通过继承`Thread`类的方式可以直接使用`Thread`类中的方法。 - 实现`...

    MyLessonsFromShildt:MyLearnJava

    9. **多线程**:Java内置了对并发编程的支持,通过Thread类或实现Runnable接口可以创建并管理多个执行线程。 10. **Java标准库**:Java API包含了大量预定义的类和接口,如集合、IO、网络、数学运算等,为开发者...

    2021-2022计算机二级等级考试试题及答案No.4240.docx

    - **知识点概述**:使用Java中的`JFileChooser`组件时可能获取不到的信息类型。 - **详细解析**:`JFileChooser`组件可以用来创建打开文件或保存文件的对话框。用户可以通过这些对话框获取文件的名称、路径以及文件...

    2021-2022计算机二级等级考试试题及答案No.11881.docx

    - **详细解析**:在Java中,实现多线程可以通过继承`Thread`类或实现`Runnable`接口两种方式。其中,实现`Runnable`接口更为灵活。具体实现步骤包括:定义一个实现了`Runnable`接口的类,并在该类中实现`run()`方法...

Global site tag (gtag.js) - Google Analytics