JAVA多线程汇总

一、概念解释

            1.主线程:JVM调用程时所产生的线程。

            2.当前线程:指通过Thread.currentThread()来获取的进程。

            3.后台线程:为其它线程提供服务的线程也成为守护线程。JVM的垃圾回收线程就是后台线程。

            4.前台线程:是指接受后台线程服务的线程,可以通过isDaemon()和setDaemon()判断和设置是否为后台线程;

                        用户线程与守护线程的区别在于是否等待主线程依赖主线程结束而结束。

            5.多线程:程序(一个进程)运行时产生多个线程。

            6.并行:指两个或多个事件在同一时刻发生。

            7.并发:指两个或多个事件在同一时间段内发生。

            8.线程安全:线程安全就是说多线程访问同一段代码,返回的结果相同。

            9.线程同步:需要牢记以下几点

                    9.1牢记关键字synchronized(锁);        

                    9.2线程同步就是线程排队;

                    9.3"共享"只有共享资源的读写访问才需要同步;           

                    9.4只有“变量”才需要同步,“常量”不需要同步;

                    9.5只要线程代码访问同一份可变的共享资源时这些线程之间才需要同步;

二、线程类常用的方法

        static void sleep(long millis)强迫一个线程休眠N毫秒(暂停执行),此操作受到系统计时器和调度程序精度的影响。

        static void sleep(long millis,int nanos)在指定的毫秒加指定的纳秒数内让正在执行的线程休眠(暂停执行)

         boolean  isAlive()判断一个线程是否存活         void  start()使该程序开始执行,java虚拟机调用线程run方法。

        void  join()等待线程终止       static void yield()暂定当前正在执行的线程,并执行其他线程

        void  join(long millis)等待线程终止时间最长为millis毫秒+nanos纳秒

        activeCount()程序中活跃的线程数      enumerate()枚举程序中的线程 

        isDaemon一个线程是否为守护线程        void  setDaemon(boolean  on)将该线程标记为守护线程或用户线程

        setName()为线程设置一个名称        wait()强迫一个线程等待    

        notify()通知一个线程继续运行            void  setPeriority(int  newPeriority)更改线程优先级

        static Thread currentThread()返回当前对象正在执行线程对象的引用

        long getId()返回该线程的标识符    String getName()返回线程名称 

        int  getPeriority()返回线程的优先级       void   interrupt()中断线程

        setatic  boolean  interrupted()测试当前线程是否已中断,

                将状清除状态置为false(连续两次调用该方法第一次可能会显示true,第二次显示false)

        boolean  isInterrupted()测试线程是否已中断,但不清除状态标志(连续两次调用该方法结果显示一直)

        

三、多线程状态也叫多线程生命周期    

                该图片来自:https://blog.csdn.net/qq598535550/article/details/52985879

             

                1.新建状态(new):新创建一个线程对象。

                2.就绪状态(Runnable):也叫可运行状态。线程对象创建后,其它线程调用了该对象的start()方法,该状态

                    的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

                3.运行状态(Running):就绪状态的线程获取了CPU执行程序代码。

                4.阻塞状态(Blockde):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,

                        才有机会转到运行状态,阻塞状态分为三种:

                         4.1等待阻塞:运行线程执行wait()方法,JVM会把线程放入等待池中。

                         4.2同步阻塞:运行线程在获取对象同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

                         4.3其它阻塞:运行的线程执行sleep()或join()方法,或者发出 I/O请求时,JVM会把该线程置为阻塞状态,

                                当sleep()状态超时,join()等待线程终止或者超时,或者 I/O处理完毕时,线程重新转入就绪状态。

                5.死亡状态(Dead):线程执行完或者因异常退出run()方法,该线程结束生命周期。

四、实现多线程的方式

        实现多线程总共有三种方式:

        4.1.继承Thread类,重写run方法。Thread类本质上也是实现了Runnable接口,它代表一个线程的实例,

                    并且启动线程的唯一方法就是通过Thread类的start方法。

        4.2.实现Runnable接口,并实现该接口的run方法。创建一个Thread对象,用实现Runnable接口的对象作为参数实例化

                                                 Thread对象,调用此对象的start方法发。

        4.3.实现Callable接口,重写call方法。Callable接口与Runnable接口的功能类似,但比Runnable接口功能强大,有三点

                4.3.1.Callable可以在任务结束后提供一个返回值,而Runnable没有。

                4.3.2.Callable中的call方法可以抛出异常,而Runnable没有这个功能。

                4.3.3.运行Callable可以得到一个Future对象,表示异步计算的结果,提供了检查计算是否完成的方法。

猜你喜欢

转载自blog.csdn.net/u013226533/article/details/80197080