线程与进程
进程是所有线程的集合,每一个线程是进程中的一条执行路径。
为什么要使用多线程?
提高程序效率。
多线程应用场景
迅雷多线程下载, 分批发送短信等。
多线程创建方式
第一种继承Thread类 重写run方法
第二种实现Runnable接口,重写run方法
第三种使用匿名内部类方式
启动线程是使用调用start方法。
使用继承Thread类还是使用实现Runnable接口好?
使用实现实现Runnable接口好,原因实现了接口还可以继续继承,继承了类不能再继承。
常用线程api
常用线程api方法 | |
start() | 启动线程 |
currentThread() | 获取当前线程对象 |
getID() | 获取当前线程ID Thread-编号 该编号从0开始 |
getName() | 获取当前线程名称 |
sleep(long mill) | 休眠线程 |
Stop() | 停止线程, |
常用线程构造函数 | |
Thread() | 分配一个新的 Thread 对象 |
Thread(String name) | 分配一个新的 Thread对象,具有指定的 name正如其名。 |
Thread(Runable r) | 分配一个新的 Thread对象 |
Thread(Runable r, String name) | 分配一个新的 Thread对象 |
守护线程和用户线程
用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止
守护线程当进程不存在或主线程停止,守护线程也会被停止。
使用setDaemon(true)方法设置为守护线程
多线程运行状态
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。
新建状态-----创建一个线程,例如 new Thread()程序还没有开始运行线程中的代码
就绪状态-----执行线程,必须调用线程的start()方法, 创建线程运行的系统资源,并调度线程运行run()方法(方法并未运行)。当start()方法返回后,线程就处于就绪状态。
运行状态------当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法.
阻塞状态------ 1>线程通过调用sleep方法进入睡眠状态;2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者; 3>线程试图得到一个锁,而该锁正被其他线程持有; 4>线程在等待某个触发条件;
死亡状态------- 1) run方法正常退出而自然死亡, 2) 一个未捕获的异常终止了run方法而使线程猝死。(可以使用isAlive方法确定当前线程是否可用)
join()方法作用
join作用是让其他线程变为等待, thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。