线程:thread与runnable

一、进程与线程的概念与关系:

      1、进程:也称为任务,计算机的操作系统看上去几乎在同一时间执行多个程序,即多任务多进程,每一个进程都有独立的代码和数据空间,进程之间的切换内存开销比较大

                       打开你的任务管理器,可以看到你当前状态下运行的进程

      2、线程:同一个程序内部在同一时间内可以进行多种运算,即多线程,而一个线程就是一个程序内部的顺序控制流,使用分配给程序的资源和 环境,线程不是程序,自己本身

                      不能运行,必须在运行于程序中

                      线程可以理解为轻量级的进程,同一类线程共享代码和数据空间,线程之间的切换内存开销比较小

      3、举个简单的实际例子解释进程与线程之间的关系:

                当你打开一个影音播放器,就是开启了一个进程,这个影音播放器里面,既有声音又有画面,可能还在下载,这些声音、画面、下载就是这个进程中的多个线程

二、线程的优先级:

              1、概念: 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。

                 当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且仅当创建线程是守护线程时,新线程才是守护程序。

              2、通过getPriority()/sePriority() 用于返回/设置线程的优先级 ,并提供三个常量MAX_PRIORITYMIN_PRIORITYNORM_PRIORITY

                 来设置 线程的最高优先级、   线程的最低优先级、线程的默认优先级。也可以通过1-10的数字来进行线程优先级的设置,数字越大优先级越高

三、线程的实现方式:通过继承Thread类和通过实现RunNable接口,都位于jdk里面java.lang包中,无论哪一种方式,都必须重写run方法

                                   每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。

      先介绍一下他们共有的run()方法,RunNable接口中只有这个run()方法,使实现接口 Runnable 或者继承Thread类的子类对象创建一个线程时,

               启动该线程将导致在独立执行  的线程中调用对象的 run 方法。方法 run 的常规协定是,它可能执行任何所需的动作。

               这就是说:当一个线程类实现了接口 Runnable或者继承了Thread类,并重写了run()方法,这个线程类的实例调用线程的启动方法start(),

                                 程序就会自动调用run()方法,执行线程,run()方法不需要程序员主动调用

      1、通过继承Thread类:

            创建线程类:

                               class PrimeThread extends Thread {        

                                       long minPrime;   

                                      //使用Thread类的有参数的构造函数

                                       PrimeThread(long minPrime) { 

                                               this.minPrime = minPrime;

                                        }         

                                       public void run() { 

                                              // compute primes larger than minPrime

                                             . . .   

                                           }

                               }

               然后,下列代码会创建并启动一个线程

                             PrimeThread p = new PrimeThread(143);

                             p.start();//线程调用此方法启动线程,然后程序就会自动的调用run()方法,

      2、通过实现RunNable接口:

                           class PrimeThread implements Runnable {        

                                       long minPrime;  

                                      //使用Thread类的有参数的构造函数

                                       PrimeThread(long minPrime) {

                                               this.minPrime = minPrime;

                                        }        

                                       public void run() {

                                              // compute primes larger than minPrime

                                             . . .  

                                           }

                               }

                  然后,下列代码会创建并启动一个线程:

                              PrimeRun p = new PrimeRun(143); 

                              new Thread(p).start();

                在这里解释一下第二种实现方式:Thread类提供了以RunNable接口或者RunNable接口的实现类声明的对象作为构造函数的参数来创建一个线程,

                                                                      而提供这种方式的原因是为了解决java类的单继承问题,因为有时候当前类可能必须或者已经继承了一个非Thread类,

                                                                      此时就不能再继承Thread类,但是还要实现线程的功能,在这种情况下就可以使用第二方式实现

四、线程的生命周期: 

               1) 新建:当一个Thread类或者其子类的对象被声明并创建时,新的线程对象处于新建状态,此时它已经有了相应的内存空间和其他资源。

               2) 就绪:处于新建状态的线程被启动后,将进入线程队列排队等待CUP服务,这个时候具备了运行的条件,一旦轮到CPU的时候,就可以脱离创建它的主线程独立开始自己的生命周期。

               3) 运行:就绪的线程被调度并获得CUP的处理边进入了运行状态,每一个Thread类及其子类的对象都有一个重要的run()方法,当线程对象被调度执行的时候,它将自动调用本对象的run()方法,从第一句代码开始执行。所以说对线程的操作应该写到run()方法中。

               4) 阻塞:一个正在执行的线程如果在某种情况下不能执行了。进入阻塞状态,这个时候它不能进入排队状态,只有引起了阻塞的原因消失的时候,线程才可以继续进入排队状态等待CUP处理。

               5) 死亡:处于死亡状态的线程不具有继续执行的能力,线程死亡主要的原因是正常运行的线程完成了全部工作,即执行完了run()方法,另外就是被提前强制的终止了。

五、线程的状态 :

 

          1)、新线程态(New Thread)
                 产生一个Thread对象就生成一个新线程。当线程处于"新线程"状态时,仅仅是一个空线程对象
           2)、可运行态(Runnable)
                start()方法产生运行线程所必须的资源,调度线程执行,并且调用线程的run()方法。在这时线程处于可运行态。该状态不称为运行态是因为这时的线程并不总是一直占用处理机。特别是对于只有一个处理机的PC而言,任何时刻只能有一个处于可运行态的线程占用处理 机。Java通过调度来实现多线程对处理机的共享。
          3)、非运行态(Not Runnable)
                当以下事件发生时,线程进入非运行态。
                ①suspend()方法被调用;
                ②sleep()方法被调用;
                ③线程使用wait()来等待条件变量;
                ④线程处于I/O等待。 
           4)、死亡态(Dead)
                当run()方法返回,或别的线程调用stop()方法,线程进入死亡态。通常Applet使用它的stop()方法来终止它产生的所有线程。

六、线程同步于线程安全

       下次再说

 

 

    

    

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值