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.悲观锁、乐观锁

悲观锁示例代码:
出现了线程安全问题


乐观锁示例代码:
