Thread、Runnable、线程状态转换、线程调度、常用函数说明.md

来源:互联网 发布:婴儿床 知乎 编辑:程序博客网 时间:2024/06/10 12:56

一、java.lang.Thread类

二、实现java.lang.Runnable接口

三、Thread和Runnable的区别

四、线程状态转换

五、线程调度

六、常用函数说明

一、java.lang.Thread类

1、继承Thread类,然后重写里面的run方法,用start方法启动线程2Java 只支持单继承,所以你继承了 Thread 的话,其他的类你就不能继承了。3Thread 不能直接进行多线程工作4、其实 Thread 只是实现 Runnable 接口,并增加了一些常用方法而已。

二、实现java.lang.Runnable接口

1、一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable target).start()方法来启动2、使用Runnable定义的子类中没有start()方法,只有Thread类中才有。3、Runnable 接口,多线程可以直接进行多线程工作

三、Thread和Runnable的区别

1、thread是类,runnable是接口2、实现多线程有两种方式:1).继承Thread,然后重写他的run方法2).实现Runnable接口,并实现他的run方法3、启动线程时也有区别1)、继承Thread的类直接调用start方法即可。2)、实现Runnable接口要这样启动runab :是实现Runnable接口类的对象。例如:Thread thr = new Thread(runab); thr.start()

四、线程状态转换

线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。 1、新状态(new):线程对象已经创建,还没有在其上调用start()方法。2、可运行状态(runnable):当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。3、运行状态(running):线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。4、等待/阻塞/睡眠状态(wait、block、sleep):这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。5、死亡态(dead):当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

五、线程调度(java)

有两种调度模型:分时调度模型和抢占式调度模型。1、分时调度模型是指让所有的线程轮流获得cpu的使用权,并且平均分配每个线程占用的CPU的时间片这个也比较好理解。2、java虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用CPU。处于运行状态的线程会一直运行,直至它不得不放弃CPU。3、调整各个线程的优先级        让处于运行状态的线程调用Thread.sleep()方法让处于运行状态的线程调用Thread.yield()方法让处于运行状态的线程调用另一个线程的join()方法线程切换:不是所有的线程切换都需要进入内核模式

六、常用函数说明

1run()start()

这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中;start()产生运行线程所必须的资源,调度线程执行,并且调用线程的run ()方法。

2sleep()wait()yield()join()stop()suspend()resume()

sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。

join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。

yield()与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。

wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。

stop()方法,线程进入死亡态,终止所有未结束的方法,不安全。

suspend() 和 resume() 方法,两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。

3notify()notifyall()

notify()从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

0 0