Thread类

线程就是一个程序(进程)中的执行线程。JVM允许一个应用并发地运行多个执行线程。


每个线程都有一个优先级。拥有较高优先级的线程比拥有较低优先级的线程优先执行。每个线程都可以被标记为一个守护线程。当一个运行中的线程内部又创建了一个新的Thread对象,那么这个新的线程的初始化优先级会被设定为和创建它的线程一样,当且仅当创建它的线程是一个守护线程的时候,这个新线程才会是一个守护线程。


当JVM启动时,总会有单个非守护线程,它通常会调用某个指定类的main方法。然后JVM持续执行所有线程,直到以下任何一个发生:


a.Runtime类的exit方法被调用,并且安全管理器允许退出操作的执行。

b.所有的非守护线程都已经停止运行,无论是在run方法中调用返回,还是在run方法之上抛出了一个异常。


有2种方式剋创建一个新的执行线程。


第一种是声明一个类为Thread类的子类。这个子类必须重写Thread类的run方法。然后该子类的实例可以被分配和启动。

另外一种就是声明一个类,实现Runnable接口。然后同样实现run方法。然后该类的实例可以被分配,然后在创建Thread对象的时候作为参数

传递过去,再通过start方法启动。


每个类都有一个名字用来作为识别的标识,多个线程可以拥有同一个名字。在创建的时候,如果没有专门指定名字,系统会根据创建顺序自动创建一个名字。


方法:

1. static sleep(long mills)方法


这个方法其实不是java自己的方法,是native方法。当此方法被调用以后,线程会被暂停,时间长短由参数决定。但是该方法被执行的时候,并不会释放任何监视器的所有权。


2. init方法是private方法,用于初始化线程,不用太多考虑,是系统级的步骤。


里面涉及到一个概念ThreadGroup,它也是lang包下的一个类。每个线程产生的时候,都会被归入某个线程组。如果没有明确规定的话,那么就归入产生它的线程所在的线程组。如果你自己指定线程组,那么一旦归入某个线程组,就不能再更换。有什么好处?可以同意管理整个线程组中的线程。你想,假如你想让一个问题发生的时候,很多线程同时被打断,这时候分组就有好处了。你也可以让某个组的线程统一设定为最高优先级或者最低。


这个东西可以以后需要的时候深究一下。


3.构造方法


Thread(),这个构造方法的内部实现其实就是调用了init()方法,为其分配了一个"Thread-"+数字的名字,数字从0开始。


Thread(Runnable target),和上面不同的是,这个指定了一个Runnable接口的参数,实现了这个接口的类的run方法将被执行。


Thread(String name),这个和第一个只有一点不同,就是重新指定了线程的名字。


其实无论是哪一种构造方法,都是同样的内部实现,调用init方法,只是传入的参数不一样。




4.start方法


线程只能使用start方法来进行调用,一旦start方法被调用,那么这个线程就会开始运行,JVM会开始调用这个线程的run方法。



5.run方法


其实线程类里面的run方法的实现就是调用Runnable接口的实例中的run方法。


这样说吧,Thread类本身就是Runnable的实例,如果是通过定义Thread类的实例,那么调用的就是Thread类中的run方法,所以通常来说必须重写Thread类中的run方法,否则就什么也不执行就直接返回。


而如果专门写一个类实现了Runnable接口,那么这个类就要作为target传给Thread类的构造方法,调用的也是这个类中的run方法。



6.interrupt方法


通过设置isInterrupted状态,使得处于阻塞状态的线程(包括被Object.wait,Thread.join,Thread.sleep方法之一阻塞的线程)退出阻塞的状态,并且会抛出一个InterruptedException。




7.setPriority和getPriority方法


Priority的值是从1到10,不能越过这个界限。默认情况下priority的值为5。


8.join方法(等效于 join(0))


有几个重载方法,join(long mills),join(long mills, int nanos),什么意思呢?假如ThreadTest线程执行join方法,这时候ThreadTest就独占资源了,不再同步,直到ThreadTest执行完毕以后,其它的线程才能执行。为什么要这么做呢?假如有5个线程同时并发执行,其中一个是计算线程,其它4个必须得到这个线程的执行结果才能进一步执行,那么就必须保证那个计算线程执行完毕了以后才能执行其它的4个。


如果加了时间参数,那么也就是要等最多那么多时间。时间参数为0就是说,一直等下去,直到执行完毕。


可以通过interrupt方法来打断,会抛出异常


9.setDaemon(boolean on)方法


首先说说什么叫守护线程。一共2种线程,一种是用户线程,一种是守护线程。如果用户线程全部都推出了,JVM也就退出了。也就是说,守护线程的级别是很低的,它的作用就是为用户线程提供服务。其实2种线程是可以相互转换的,各个方面也基本上是相同的,唯一的不同点只有一个,就是判断JVM什么时候离开。


试想,本来守护线程就是为用户线程服务的,如果用户线程全部都不存在了,那么守护线程也没有存在的意义了,这个时候JVM也就可以退出了。


需要注意的是,如果你在一个守护线程里面创建了一个新的线程,那么这个线程不用设定,直接就是守护线程。对于用户线程来说,同理。


具体怎么用呢,举个例子。假如你在编辑一份文档,那么后台就可能有一个守护线程,它一直在后台检查拼写错误,并不耽误你写。等它的时间片到了,拼写错误就会被提示出来。当你退出编辑的时候,拼写检查也就没有必要了。








你可能感兴趣的:(JAVA,SE,重要包和类解析)