线程的创建和启动
Java中jvm允许程序运行多个线程,通过java.lang.Thread类来实现
每个线程通过某个特定的Thread对象的run()方法来完成操作,经常把run()方法的主体叫做线程体
通过该Thread对象的start()方法来调用这个线程。
何时需要多线程?
程序需要同时执行两个或多个任务
程序需要实现一些需要等待的任务,如:用户输入、文件读写、网络操作、搜索
需要一些后台运行的程序
线程的创建与启动有两种方式:
方式一:
继承Thread类
在该子类重写run()方法
创建Thread的子类对象
使用 对象名.start() 启动该线程
方式二:
实现Runnable接口
该实现类重写run()方法
创建实现类的对象
创建Thread对象,将Runnable实现类对象作为实参放入Thread构造器中。如: Thread t = new Thread(Runnbale实现类对象名);
调用Thread实例对象的start()方法启动该线程。如:t.start();
Thread类的相关方法
void start():启动线程,并执行对象的run方法
run():线程在被调度时执行的操作
String getName():返回线程的名称
void setName(String name):设置该线程的名称
static currentThread():返回当前线程
static void yield():线程让步 暂停当前的线程当前线程返回就绪队列等待cpu重新调度
join():线程插队 例如在A线程正在执行时遇到 B.join() 则A线程停止运行等待B线程执行完毕以后再执行。
static void sleep(long millis):(指定时间:毫秒)当前线程调用sleep之后将放弃对CPU的控制,但不释放资源,待到指定时间过后再进入就绪队列重新排队等待被调用。
stop():强制线程生命期结束
boolean isAlive():返回一个boolean类型的值,判断线程是否还活着
int getPriority():返回线程的优先级
int setPriority(int newPriority):改变线程的优先级为newPriority
线程的优先级1-10,数字越大优先级越高,Thread类中的优先级常量
MAX_PRIORITY 10
MIN_PRIORITY 1
NORM_PRIORITY 5
默认的线程优先级为5
多线程程序的优点
1、提高程序响应时间,提高用户的体验度
2、提高CPU的利用率
3、改善程序结构,将既长又复杂的进程分为多个线程,独立运行,便于理解和修改
守护线程
线程分为守护线程和用户线程,守护线程是为用户线程服务的
jvm必须要等到用户线程执行完毕之后才能停止,但jvm不需要等到守护进程完全执行完毕即可退出
通过在调用start()方法前,使用 线程名.setDaemon(true); 将该线程设置为守护线程
线程的生命周期
线程的声明周期分为这几个阶段:
当一个Thread或Thread的子类被实例化的时候就进入新建状态
当调用start()方法后就进入就绪状态等待CPU的调度,一旦得到CPU的调度后就进入运行状态
运行状态下如果该线程调用了yield()方法则重新进入就绪队列等待CPU的调度;如果调用了wait()、join()、sleep()、suspend()方法则进入阻塞状态,待到阻塞解除的合适条件(如:sleep指定的时间过后;wait方法阻塞的线程被notify()或notifyAll()方法唤醒)则重新进入就绪队列;在运行状态下如果调用了stop()或出现错误或者异常或线程体执行完毕则进入死亡状态。