进程和线程
进程是一次程序的执行,如查看“Windows任务管理器”中的列表,可以将运行在内存中的exe文件理解成进程,进程是受操作系统管理的基本运行单元。
线程可以理解成是进程中独立运行的子任务。一个进程可以有多个线程同时运行。
多线程实现方式
主要有两种:继承Thread类和实现Runnable接口。
继承Thread类
Thread类实现了Runnable接口。
public class Thread implements Runnable
在使用多线程技术时,代码的运行结果与代码执行顺序或调用顺序无关。线程是一个子任务,CPU以不确定的方式或者说是以随机的时间来调用线程中的run方法。
Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。这个过程其实就是让系统安排一个时间来调用Thread中的run()方法,也就是使线程得到运行,启动线程,具有异步执行的效果。此外,执行start()方法的顺序不代表线程启动的顺序。
实现Runnable接口
使用继承Thread类的方式来开发多线程在设计上有局限性,因为Java是单根继承,而使用实现Runnabel接口的方式来实现多线程技术可以克服这一点。
Thread构造函数Thread(Runnable target)不光可以传入Runnable接口的对象,还可以传入一个Thread类的对象。
currentThread()方法
currentThread()方法可返回代码段正在被哪个线程调用的信息。
isAlive()方法
isAlive()方法的功能是判断当前的线程是否处于活动状态。
sleep()方法
方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。
getId()方法
getId()方法的作用是取得线程的唯一标识。
停止线程
在Java中有以下3种方法可以终止正在运行的线程:
1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
2. 使用stop方法强行终止线程,这个方法已被deprecated。
3. 使用interrupt方法中断线程
停止不了的线程
调用interrupt()方法仅仅是在当前线程种打了一个停止的标志,并不是真的停止线程。
判断线程是否是停止状态
Thread.java类提供了两种方法:
1. this.interrupted():测试当前线程是否已经中断,执行后具有将状态清除为false的功能,静态方法。
2. this.isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志。
在沉睡中停止
如果在sleep状态下停止某一线程,会进入catch语句,并且清除停止状态值,使之变为false。
调用stop停止(deprecated)
调用stop()方法时会抛出java.lang.ThreadDeath异常,但在通常情况下,此异常不需要显式地捕捉。
yield方法
yield()方法(static)的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,,马上又获得CPU时间片。
线程的优先级
设置线程优先级有助于帮“线程规划器”确定在下一次选择哪一个线程来优先执行。
设置线程的优先级使用setPriority(int newPriority)方法。
线程优先级的继承特性
在Java中,线程的优先级具有基础性,比如A线程启动B线程,则B线程的优先级与A是一样的。
优先级具有规则性
高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行完。
线程的优先级与代码执行顺序无关。
——本文并非原创,如有侵权请联系管理员删除。