创建线程类

  一直想把关于线程的相关问题给理清了,结果拖了好几天。今天,希望一次性全解决了吧。不过,问题挺多,还得一个一个来。这里就先谈谈创建线程类。

  java使用Tread类代表线程,所有的线程对象都必须是Tread类或其子类的实例。每条线程的作用是完成一定的任务,实际上就是执行一段程序流(一段执行程序的代码)。java使用run方法封装这样一段程序流。我们可以通过继承Tread类和实现Runnable接口两种方式来创建线程。

       通过继承Tread类来创建并启动线程的步骤如下:

               1.定义Tread子类,并重写该类的run方法,该run方法的方法体就是代表了线程需要完成的任务。因此,我们把run方法称为线程执行体。

                2.创建Tread子类的实例,即创建了线程对象。

               3.用线程对象的start方法启动该线程。

       下面的一段程序示范了通过继承Tread类来创建和启动线程的程序:

           

          启动线程时,按照谁先抢到谁先用的原则来分配cpu,所以,虽然上面的代码中我们写的是顺序是I.start();you.start();但是执行时也有可能是you线程先启动。另外,Thread类还提供了两个静态方法:currentThread()返回当前正在执行的线程对象;getName()返回该方法的线程的名字。

         最后,使用继承Thread类的方法创建线程,多条线程之间无法共享线程类的实例变量。

         另外一种创建线程的方式是实现runnable接口。这种方式的步骤如下:

                 1.定义Runnable接口的实现类,并重写该接口的run方法,该run方法飞方法体同样是该线程的执行体;

                  2.创建Runnable实现类的实例,并以此实例作为Thread的target来创建Rhread对象,该Thread对象才是真正的线程对象。

       

  注意事项上面代码中的注释部分已经说明了,这里就不再重复了。

  对于这两种创建线程的方式,我更喜欢第二种。采用Runnable接口方式的线程有一下两点优势:

             1.线程类只是实现了Runnable接口,还可以继承其他类;

              2.在这种形式下,可以多个线程共享一个target对象,所以非常适合多个相同线程来出来同一份资源的情况,从而可以讲cpu、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。

         当然,相对于继承Thread类来说,这种方式变成稍微复杂,如果要访问当前线程,必须要使用Thread.currentThread()方法。

         继承Thread类的实现方式相对来说,变成简单,如果要访问当前线程直接用this即可。但是,这种方式不能再继承其他父类,更重要的是无法实现数据共享。

       关于这点,我们可以通过分别用这两种方式实现售票系统的设计的代码及其运行结果来证明:

      Thread类的实现方式:


运行结果:


我们不难看出,Thread子类创建的线程独立的处理资源,每一条线程都自作主张的把每一张票售出一次,不能实现资源共享。而实现Runnable接口的方式就不会如此,我们可以看下面这段代码:


          运行结果:

      


 

  在一个线程的创建与调用的程序中,main()方式是应用程序的执行的起点,start()方法启动线程,run()方法是线程的执行起点,也规定了线程的执行任务。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值