Java内存模型(jmm)
线程通信
消息传递
重排序
顺序一致性
Happens-Before
As-If-Serial
一、创建线程的方式
1.继承Thread类,重写该类的run()方法。类
2.实现Runnable接口,并重写该接口的run()方法,该run()方法同样是线程执行体,创建Runnable实现类的实例,并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象。接口
3.使用Callable和Future接口创建线程。具体是创建Callable接口的实现类,并实现clall()方法。并使用FutureTask类来包装Callable实现类的对象,且以此FutureTask对象作为Thread对象的target来创建线程。有返回值和异常。JUC包
二、线程的生命周期及五种基本状态
2.1 线程生命周期:新建(new)、就绪(start/yield等)、运行(CPU run)、阻塞(sleep/join等)、死亡(stop/加flag)。
2.2 Thread类和Object的方法
sleep暂停/yield礼让属于类方法;join插队属于对象方法。
2.3 守护线程
用户线程和守护线程(Daemon)。jvm的退出不用等待守护线程执行完成。例:垃圾回收线程。应用场景:jvm退出时,线程能够自动退出。
设置守护线程:t.setDaemon(true) 验证守护线程:t.isDaemon.
2.4 Hook(钩子)线程
jvm退出的时候,钩子线程就会被启动执行。
Runtime.getRuntime().addShutdownHook(new CleanWorkThread());
2.5 常用方法
isAlive()、setName()、getName()、currentThread()类方法。
三、高并发
3.1 并发:同一个对象多个线程同时操作。抢占资源
3.2 线程同步(线程安全):队列与锁 Synchronized
锁机制:锁住对象或Class对象。
3.3 Synchronized方法