写一点基础,忘记了不用去翻书。
先说一下线程跟进程的关系:进程由操作系统进行管理的,而线程在包含在进程里面,
一个进程一般可以有有多个线程。线程的切换在用户态,开销小,效率高;而进程的
切换在核心态,开销高,效率相对低。多线程编程可以提高程序效率。
java 中多线程编程两种方法:1 继承 Thread 类 ;2 实现 Runnable 接口。
1.Tread 类:java.lang.Tread,它是一个具体的类而不是抽象类,该类封装了线程的行为,
要创建一个线程必须创建一个Tread 类的子类,并且重写它的 run()方法,run()即线程体,
是该线程真正执行的东西。但是我们 不调用run()方法,而是通过调用start()方法启动线程。
调用start()方法时,start方法会对与多线程 有关的进行初始化,使得线程处于就绪态,
一旦获得cpu即可进入运行态。
2.Runnable接口:java.lang.Runnable;该接口只定义了 一个 run()方法,所以必须实现它。
注:一般使用实现接口的方式实现多线程,因为java的继承是单继承,即一个类最多只能继承
一个父类,但是可以实现多个接口
线程的生命周期:
1.创建状态:利用 new关键字创建线程对象后实例后,它仅仅作为一个对象存在,没有获得任何资源。
2.就绪状态:调用start() 方法,线程转化为就绪态。此时对线程进行初始化,获得除了CPU外的其他所有
资源,一旦获得CPU使用权即可进入运行态。
3.运行态:线程正在运行。
4.阻塞态:指线程的暂停,此时不获得CPU。等待某个条件使得线程转化为就绪态。比如当一个线程进行
文件的读取时会先将线程阻塞然后进行文件读取操作,当文件读取完毕时再通知线程使得线程转化为就绪态。
4.死亡状态:调用线程对象的stop()方法后线程停止,资源比JVM回收。
线程的几个方法:
sleep():可以使线程在指定时间进入阻塞状态,比如sleep(1000)表示让线程阻塞 1 秒。
suspend() 和resume()方法:suspend()方法使得线程进入阻塞状态并且不会自动恢复,
必须与对应的resume()方法调用才能使线程变为就绪态。
wait()和notify()方法:wait()使得线程进入阻塞态并且可以指定以毫秒为单位,单超时时,
对应的motify()被调用使得线程重新为就绪态。