继承Thread类
重写run方法
实现Runnable接口
重写run方法
模拟龟兔赛跑
实现Callable接口
重写Callable方法,需要定义一个返回值
静态代理模式
lambda表达式 任何一个接口包含一个抽象方法,它就是函数式接口,可以用lambda表达式简化内部代码,创建该接口的对象
new Thread( () -> System.out.printlin("……") ).start();
线程停止
线程休眠Thread.sleep() 让线程延迟
线程礼让Thread.vield() 让别的线程先执行,但是不一定成功
线程插队(强制执行)Thread.join() 强制执行这个线程
Thread.State 线程状态观测
- 线程状态。 线程可以处于以下状态之一:
- NEW
尚未启动的线程处于此状态。 - RUNNABLE
在Java虚拟机中执行的线程处于此状态。 - BLOCKED
被阻塞等待监视器锁定的线程处于此状态。 - WAITING
正在等待另一个线程执行特定动作的线程处于此状态。 - TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。 - TERMINATED
已退出的线程处于此状态。
一个线程可以在给定时间点处于一个状态。 这些状态是不反映任何操作系统线程状态的虚拟机状态。
- NEW
getPriority()/setPriority(int xxx) 获取/改变线程的优先级,范围1-10
守护线程 thread.setdaemon(true/false)默认是false表示是用户线程,正常的线程都是用户线程
线程同步 synchronized 同步方法public synchronized void method(int args){}
同步块synchronized(Obj——>增删改查的对象){}
三大不安全案例
1、买票
2、银行取钱问题
3、不安全线程
死锁
多个线程各自占有一些共享资源﹐并且互相等待其他线程占有的资源才能运行﹐而导致两个或者多个线程都在等待对方释放资源﹐都停止执行的情形﹒某一个同步块同时拥有“两个以上对象的锁”时﹐就可能会发生“死锁”的问题
死锁现象:
解决方法:将代码块拿出来,不同时用一把锁
lock锁 private final Reentrantlock lock = new Reentrantlock();
用lock.lock();方法加锁。lock.unlock();方法解锁
lock.lock();
try{ //保证线程安全的代码}
finally{ lock.unlock();//如果代码有异常,将unlock()写入finally语句块}
生产者消费者问题:管程法
信号灯法
线程池
背景: 经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
思路: 提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。
好处:
提高响应速度(减少了创建新线程的时间)
降低资源消耗(重复利用线程池中线程,不需要每次都创建)便于线程管理(....)
corePoolSize:核心池的大小maximumPoolSize:最大线程数
keepAliveTime:线程没有任务时最多保持多长时间后会终止