1.进程与线程定义
进程包含线程,如一个百度网盘进程,该进程的线程可以有上传,下载。
2.创建线程的三种方式
方式1-继承Thread类
方式2-实现Runnabled接口
1.常规写法
2.匿名内部类写法
方式3-实现Callable接口
示例代码:
f1.get()方法得到call方法的返回值
也就是说当线程执行完后,get()方法才执行,这样才能得到线程执行完后的返回值。
3.Thread的常用方法
示例代码:
1.getName()方法获取线程名称
2.setName(字符串)方法为线程取名
3.构造器super(name)方法为线程取名
4.sleep(毫秒值)线程睡眠
5.join()让当前该线程先执行完,其他线程再执行
4.认识线程安全
5.线程同步(解决线程安全问题)
1.同步代码块(synchronized)
1.对于静态方法,synchronized(类名.class)
2.对于示例方法,synchronized(this)
2.同步方法
synchronized不但可以修饰方法,还可以修饰成员变量、静态变量等。
同步代码块锁的范围更小,性能更好,因为需等待的范围小
3.Lock锁
1.创建锁对象,并多态写法,建议用final修饰
2.加锁和解锁,解锁一定要放在finally里,因为中间代码一旦出错,未解锁的话,该实例的其他线程会一直等待解锁
6.线程通信
wait()、notify()及notifyAll()方法。
示例代码:
7.线程池
定义
创建线程池
方式一
构造器参数描述
参数五任务队列可以是new ArrayBlockingQueue<>(n)表示n个缓存队列,new LinkedBlockingQueue<>()表示可以无限多个队列。任务队列是指线程排队的队列
参数六线程工程可以是Executors.defaultThreadFactory()表示使用默认的线程工程。
参数七任务拒绝策略如果是new ThreadPoolExecutor.AbortPolicy()表示抛异常进行处理。
注意事项
常用方法
1.线程池处理Runnable任务的方法
2.线程池处理Callable任务的方法
示例代码1:处理Runnable线程
线程池并没有死亡
线程池的关闭
创建临时线程
都满了,执行任务策略
示例代码2:处理Callable线程
拒绝策略
方式二-Excutors工具类(创建的线程可定期执行任务)
pool就是线程池对象
注意事项:
8.并发与并行及线程的生命周期
并发的每次处理16个线程,所以说并发和并行同时进行的
sleep方法不会释放锁权限。
9.悲观锁、乐观锁
悲观锁示例代码:
出现了线程安全问题
乐观锁示例代码: