什么是进程
- 进程是指可执行程序并存放在计算机存储器的一个指令序列,他是一个动态执行的过程
 
什么是线程
- 线程是比进程还要小的运行单位,一个进程包含多个线程
 - 线程可以看做一个子程序
 
线程的创建
- 创建一个Thread类,或者一个Thread子类的对象
 - 创建一个实现了Runnable接口的类的对象
 - 创建一个实现了Callable接口的类的对象
 
继承Thread类
1  | public class CustomThread extends Thread {  | 
Runnable 接口
- 只有一个方法run()
 - Runnable是Java中用已实现线程的接口
 - 任何实现线程功能的类都必须实现该接口
 - 为什么要实现runnable接口?
- Java不支持多重继承,如果一个类已经继承了一个父类,那么他只能通过实现runnable接口变成线程
 - 可以不重写Thread类的其他方法,只需要重写Run()方法
 
 
1  | public class PrintRunnable implements Runnable{  | 
1  | class PrintRunnableTest {  | 
实现callable接口
- 重写call()方法,作为线程的主体,具有返回值,并且可以对异常进行声明和抛出, 使用start()方法来启动线程
 
- 创建callable接口的实现类,并实现call()方法
 - 创建callable实现类的实例,使用FutureTask类来包装callable对象,该FutureTask对象封装了callable对象的call()方法的返回值
 - 使用FutureTask对象作为Thread对象的target,创建并启动线程
 - 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
 
- 实现callable接口,创建线程
 
1  | public class CustomThread implements Callable<String> {  | 
- test thread
 
1  | @Test  | 
线程的状态
- new
 - runnable
 - running
 - blocked
 - dead
 

sleep方法的使用
public static void sleep(long millis)- 作用:在指定的毫秒数内让正在执行的线程休眠(暂停执行)
 - 参数为休眠的时间,单位是毫秒
 
1  | while (i <= 30) {  | 
join方法应用
public final void join()- 等待调用该方法的线程结束后才能执行 (调用者抢占CPU使用权)
 public final void join(long millis)- 等待该线程终止的最长时间为millis毫秒
 
线程优先级
- Java为线程类提供了10个优先级
 - 优先级可以用整数1-10表示,超过范围会抛出异常
 - 主线程默认优先级为5
 getPriority()setPriority()
优先级常量
- MAX_PRIORITY 10
 - MIN_PRIORITY 1
 - NORM_PRIORITY 5 (默认)
 
多线程运行问题
- 各个线程是通过竞争CPU时间获得运行机会的
 - 各线程什么时候得到CPU时间,占用多久,是不可预测的
 - 一个正在运行的线程在什么地方被暂停是不确定的
 
同步
- synchronized 可以被用在
- 成员方法
 - 静态方法
 - 语句块
 
 
线程间通信
- 生产者 - 消费者 模型
 - wait()方法,终端方法的执行,是线程等待
 - notify()方法,唤醒处于等待的某一个线程,使其结束等待
 - notifyAll()方法,唤醒处于等待的所有线程,使它们结束等待