技术开发 频道

JAVA线程:两种不同创建方式全面解析

  【IT168技术】最近一直在看提升javascript代码性能的资料,看来看去就是为了如何提升网站的并发能力或者是软件如何对海量数据进行处理,这里我不想探讨解决这些难题的解决方案,但要解决并发或者是海量数据的问题一定离不开线程,线程的确相当的重要,当你要满足日新月异的用户需求而你所做的软件没有好好利用线程的知识绝对是一件无法让人接受的,就算你是一个关注前端技术的工程师也不会幸免对线程的运用,我相信不到三年我们的主流浏览器都会或多或少有类似的线程开发模型。同时线程也是面试最爱问的问题,线程的确可以很好的衡量一个程序员水平的技术难点,对于一个关注技术的工程师,想把软件真正做好,一定要熟练掌握好线程,我就从今天开始好好复习下线程的知识。

  我主要的工作语言是java,我就从java里的线程技术讲起。

  在java里创建线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。

  第一种创建线程的方法:继承Thread类

  Thread类最重要的方法是run(),你如果想实现线程你就得覆盖这个方法,run里面的内容就是你要实现线程所具有的功能。而Thread里的run方法总会以某种形式进行循环,如果run方法里没有跳出循环的条件,线程将会一直运行下去。编写好一个线程对象后,对象要通过start()方法启动线程,构建的线程对象如果不调用start()方法,线程将永远都不会执行run方法里写好的业务逻辑。

  下面是一个最简单的线程实例:

package cn.com.sxia;
public class SimpleThread extends Thread {
    
private int countDown = 5;//构建的Thread对象内部使用的数据
    private static int threadCount = 0;//静态变量属于类,目的是为了每个构建的线程定义一个名称
        public SimpleThread(){
        
super("" + ++threadCount);
        start();
    }
        
public String toString(){
        
return "#" + getName() + ": " + countDown;
    }
        
public void run(){
        
while(true){
            System.out.println(
this);
            
if (--countDown == 0)
                
return;
        }
    }
        
public static void main(String[] args) {
                
for (int i = 0;i < 5;i++)
        {
            
new SimpleThread();
        }
    }
}

  结果如下:

#1: 5
#
2: 5
#
1: 4
#
3: 5
#
2: 4
#
2: 3
#
3: 4
#
1: 3
#
3: 3
#
2: 2
#
5: 5
#
3: 2
#
4: 5
#
1: 2
#
4: 4
#
3: 1
#
5: 4
#
2: 1
#
5: 3
#
4: 3
#
1: 1
#
4: 2
#
5: 2
#
4: 1
#
5: 1

   我们写的代码里都是直接new一个继承了Thread的类,这里会有一个奇怪的问题,构建的这个对象没有被任何变量所引用,按照java里垃圾回收机制,thread对象会被马上进行回收,但是事实上构建的对象并没有被及时回收,这是为什么呢?因为每一个新建的thread对象都只有离开了run方法后才能把它清理掉,换句话说只要thread的run方法还在执行时候不管这个thread对象处在什么状态下(是被引用了还是没被引用),thread对象都不会被回收。

  Java里用Thread实现线程是标准的做法,上面我写了个很简单的例子,在这里我想回过头来讲讲线程的原理,学技术,我一个经验一定要知其然还要知其所以然,只是会用而不懂其原理那你就是把自己变成编写代码的工具了,我们应该学会如何是运用技术来解决实际发生的问题,那么前提一定要知其然还要知其所以然。

        当我们走进线程时候,我们会发现我们将进入一个完全不同的编程领域。我常常把线程技术当做计算机编程语言里的克隆技术,线程技术可以将程序转换成彼此分离,内容相同,但又可以独立运行的计算任务。现实中多线程技术通常的用法就是在你程序里的某一个部分会与一个特定的资源或事件相联系,但是这种联系你又不希望主程序专门抽时间去解决它,那么你就可以拷贝一份代码独立运行这个计算任务,以至于该计算任不会影响到主程序的运行。

0
相关文章