线程(Thread)

来源:互联网 发布:mac ruby woo 编辑:程序博客网 时间:2024/05/30 04:12

        线程是Java乃至所有应用开发的必修基础课,引入多线程可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

        以下,我将从进程和线程的比较、自定义线程、线程生命周期和线程安全等方面对线程进行介绍:


        一、进程 VS 线程

               1、进程:计算机正在执行的程序,内存分配的最小单位;一个进程可以包括多条线程。

                               多进程:智能手机多个程序并行或并发执行。

                               单进程:老式非智能手机一次智能运行一个程序。

               2、线程:计算机程序执行的最小单位。

                              多线程:一个应用程序有多条执行路径,路径之间独立。

                              单线程:一条执行路径。

               3、补充:一个Java应用程序在执行过程中通常有两个线程在执行,分别为 main() 函数主线程

                              和GC(垃圾回收)线程。


       二、自定义线程的两种方式:

               1、继承 Thread 类,并重新 run() 方法;

                  

               2、实现 Runnable 接口;

                  

                    再通过 new Thread(new MyRunnable()).start() 调用;


       三、线程生命周期(状态转换):

              

               补充:

               1、Thread.start() 方法只能执行一次,否则抛出 IllegalThreadStateException。

               2、线程执行 sleep() 方法,线程进入阻塞状态,但不释放资源;线程执行 wait() 方法进入阻塞状态并

                    释放资源。

               3、线程执行 Thread2.join() 方法时,当前线程进入阻塞状态,并让出CPU使用权给Thread2,只有

                     Thread2 执行完毕,当前线程方可进入就绪状态,等待CPU调用。

               4、可通过调用 Thread.currentThread.getName() 方法获取当前线程名字;其中线程名字由 JVM

                   (Java虚拟机)赋值,也可通过调用Thread.setName(String) 方法自定义。

              

       四、线程优先级(Priority):

               1、默认优先级为 5;

               2、线程在执行过程中不能更改优先级,必须在线程进入就绪状态前即 start() 执行前进行设置;

               3、优先级范围 [1 - 10],数字越大,优先级越高;

               4、自定义优先级:Thread.setPriority(int)。


       五、线程安全(仅限于多线程):

              1、锁对象概念:

                             在 Java 中每一个对象都有一个内置的对象锁,而且这个锁只有一把钥匙。这就决定了

                  当一个线程获取了该对象锁的时候别的线程无法再获取,只有当该获取对象锁的线程释放对象

                  锁后其他线程才可获取。

              2、常用的两种锁对象方式:

                    1> 同步代码块:(锁对象)

                    

                    2> 同步方法:(普通方法:锁对象,静态方法:锁字节码 .class)

                         普通方法:

                    

                         静态方法:

                     

            3、死锁:

                         多线程中,当一个线程拥有另一个线程资源所需,而另一个线程也拥有该线程资源所需,并且

                 彼此都必须在获得对方资源(即对象锁)时才能持续执行;当两方都不退让的时候,就会陷入一种

                 僵持状态——死锁。

       

     六、线程之间通信:

            1、wait():等待,将当期线程从运行状态转到阻塞状态,并释放对象锁;

            2、notify():唤醒一个对应对象锁的线程;

            3、notifyAll():唤醒所有对应对象锁的线程;

            补充:以上三个方法属于Object类,不是线程特有方法,要在同步代码里面使用才有意义。