第九章 多线程
一、进程与线程:
①进程:程序的一次动态执行过程
②线程:程序的运行流程,是进程的进一步划分
③多线程:并发机制的一种有效手段,可以同时运行对个
程序块
二、Java中线程的实现:
①继承Thread类:
1、定义格式: class 类名称 extends Thread{
属性;
方法;
public void run(){
线程主体;
}
}
2、启动线程: start方法(不能直接调用run方法)
例:MyThread mt = new MyThread(“线程”);
mt.start();
3、注意事项:start方法只能调用一次,否则会抛出
“IllegalThreadStateException”异常
②实现Runnable接口(更优):
1、定义格式: class 类名称 implements Runnable{
属性;
方法;
public void run(){
线程主体;
}
}
2、启动线程: Thread类中的start方法
例:MyThread mt = new MyThread(“线程”);
Thread t = new Thread(mt);
t.start();
3、注意事项:Thread类中提供了public Thread
(Runnable target)和public Thread(Runnable
target,String name)两个构造方法接收Runnable
的子类实例对象
③Thread类和Runnable接口:
1、Thread类也是Runnable接口的子类
2、实现Runnable接口适合多个相同程序代码的线
程去处理同一资源的情况
3、实现Runnable接口可以避免由于Java单继承特
性带来的局限
4、实现Runnable接口增强了程序的健壮性,代码
能够被多个线程共享,代码与数据是独立的
三、线程的状态:
①创建状态:Thread类的构造方法;处于不可运行状态
②就绪状态:start方法;处于排队等待状态
③运行状态:自动调用run方法;就绪状态的线程被调用
并获得处理器资源
④堵塞状态:sleep方法、suspend方法、wait方法;人为
挂起或需要执行耗时的输入输出操作时,堵
塞消除后,可转入就绪状态
⑤死亡状态:stop方法;人为调用stop方法或run方法执
行结束后,不具有继续运行能力
四、线程操作的相关方法
①取得和设置线程名称:getName()和setName()
1、一般在启动线程前设置名称,也允许为正在运行
的线程设置名称
2、允许两个线程对象同名,但应尽量避免这种情况
3、无名线程系统会自动分配名称“Thread-Xx”
②判断线程是否启动:isAlive();判断线程是否启动而且仍
在运行
③线程的强制运行:join();强制运行期间,其他线程无法
运行,必须等到此线程完成之后才可
以继续执行
④线程的休眠:sleep()
⑤中断线程:interrupt()
⑥后台线程:setDaemon();java进程结束,后台线程也可
以继续执行
⑦线程的优先级:setPriority();优先级越高的线程越有可
能被先执行,但不一定先执行,要看CPU调度
1、MAX_PRIORITY : 10
2、NORM_ PRIORITY : 5(主方法为此优先级)
3、MIN_PRIORITY : 1
⑧线程的礼让:yield();操作暂时让给其他线程
⑨线程的等待与唤醒:wait()和notify()
⑩PS:
1、Runnable接口的子类对象直接调用run方法,是
主方法的线程运行
2、Java程序运行至少启动两个线程:main线程和
垃圾收集线程
3、主线程有可能比其他线程先执行完,此时其他线
程不会受到任何影响
五、同步与死锁
①同步:多个操作在同一个时间段内只能有一个线程进行
②同步方法:
1、同步代码块: synchronized(同步对象){
需要同步的代码;
}
2、同步方法:synchronized 方法返回值方法名称(参数列表){
方法体;
}
③死锁:两个线程都在等待对方先完成,造成了程序停滞
④PS:1、过多的同步有可能产生死锁
2、Java中方法定义的完整格式:
访问权限 [final][static][ synchronized] 返回值类型方法名称(参
数类型参数名称…)[throws Exception1, Exception2]{
[return [返回值|返回调用处]];
}
六、线程的生命周期