java学习笔记79--java中的线程

1)Thread类
        java.lang.Thread类
        public class Thread extends Object implements Runnable{..}
        Thread是java中的线程类,是对java中线程的抽象,Thread类型的对象就可以表示java中的一个线程

        注:一个线程对象的作用就是可以单独运行我们所交给它的任务
        注:Thread类及其子类的对象都可以表示一个线程对象

2)线程的分类
        在Java中有两类线程:
            用户线程 (User   Thread)
                也可以称为前台线程、执行线程
            守护线程 (Daemon Thread)。
                也可以称为后台线程、精灵线程(Daemon有精灵的意思)
        
        守护线程,是指程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

        用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的退出: 如果用户线程已经全部处于死亡状态,虚拟机也就退出了,这是也不用管守护线程是否还存在了

        注:java中创建出来的线程默认是用户线程,但是在启动线程前可以通过特定方法(setDaemon)把该线程转为守护线程


3)名字叫"main"的线程
        当我们运行一个java程序的时候,其实就是让JVM创建一个名字叫"main"的线程,然后让这个线程去执行我们所编写的类中main方法的代码。我们可以把这个线程称之为main线程或主线程,因为这个线程是第一个执行我们编写代码的线程,但是这时候并不是只有这一个线程在JVM中,可以通过jconsole观察到当前的所有线程
        注:jconsole是JDK自带的监测java程序运行的工具

    
4)多线程程序
        我们之前所编写的代码绝大多数都是main线程执行的(单线程),但也有一些是多线程的程序,例如在GUI中的定时器Timer的使用,其实就是启动了一个新的线程,要不然怎么可能做到一边打地鼠加分,一边还可以进行倒计时显示.

        由于java中允许在一个线程中创建并启动另一个线程,所以我们可以很容易的编程出一个多线程程序来。
        思考:为什么要编写多线程程序,单线程程序不好么?


5)多线程程序的执行
        为了提高程序执行效率,很多应用中都会采用多线程模式,这样可以将任务分解以及并行执行,从而提高程序的运行效率。但这都是代码级别的表现,而硬件上需要使用CPU的时间片模式来提供支持。程序的任何指令的执行都要竞争CPU这个最宝贵的资源,不论程序分成了多少个线程去执行各自的任务,这些线程都必须通过一定的方式来获取时间片,从而得到CPU的使用权进行代码的执行。
        注:时间片就是CPU分配程序的使用时间,每个线程获得一个时间片后,在此段时间内是可以使用CPU进行运算的,但时间用完后就要交出CPU的使用权.

        注:不同操作系统中,或者同类操作系统的不同算法中,时间片的大小是不一样的,但是不论哪种情况,对象我们来讲,这个时间片都是一个极短的一段时间.
        让线程获得时间片的算法有多种,但是现在一般都是"抢占式",就是默认情况下,多个线程具有同等几率抢占到CPU的下一个时间片,最终谁能抢到那么这个时间片就算是谁的,使用完之后再退出来重新再争夺一下CPU的时间片

猜你喜欢

转载自blog.csdn.net/onepiece_loves/article/details/88757531