一、多线程创建的三种方式
(1)通过继承Thread本身


(2)通过实现runnable接口


(3)通过 Callable 和 Future 创建线程


其中,前两种不能获取到编程的结果,第三种能获取到结果
二、常见的成员方法
|----------------------------------|----------------------|
| 方法名称 | 说明 |
| String getName() | 返回此线程的名称 |
| void setName(String name) | 设置线程的名字(构造方法也可以设置名字) |
| static Thread currentThread() | 获取当前线程的对象 |
| static void sleep(long time) | 让线程休眠指定的时间,单位为毫秒 |
| setPriority(int newPriority) | 设置线程的优先级 |
| final int getPriority() | 获取线程的优先级 |
| final void setDaemon(boolean on) | 设置为守护进程 |
| public static void yield() | 出让线程/礼让线程 |
| public static void join() | 插入线程/插队线程 |
构造方法不能继承
守护线程:当其他的非守护线程执行完毕之后,守护线程会陆续结束
三、线程的生命周期

四、线程安全问题
(1)同步代码块
把操作共享数据的代码锁起来
格式:
//锁对象,一定要是唯一的
static Object obj = new Object();
synchronized(锁){
操作共享数据的代码
}
特点一:锁默认打开,有一个线程进去了,锁自动关闭
特点二:里面的代码全部执行完毕,线程出来,锁自动打开
(2)同步方法
格式:
修饰符 synchronized 返回值类型 方法名(方法参数){
}
特点一:同步方法是锁住方法里面所有的代码
特点二:锁对象不能自己指定
非静态:this
静态:当前类的字节码文件对象
StringBuilder 和StringBuffer
单线程用一,多线程用二
(3)lock锁
lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
lock提供了获得锁和释放锁的方法
void lock():获得锁
void unlock():释放锁
Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
ReentranLock的构造方法
ReentrantLock():创建一个ReentrantLock的实例