创建线程的三种方式
继承Thread类
- 创建一个类继承Thread类
- 重写run方法
- 启动线程 thread.start();
实现Runnable接口
- 创建一个类实现 Runnable接口
- 重写run()方法
- new Thread(Runnable).start();启动
实现Callable接口
- 创建一个类实现 Callable接口
- 重写call()方法,需要有返回类型
- new Thread(Callable).start();启动
并发
多个线程访问同一资源
synchronized
隐式同步锁
同步方法
加在方法上,锁的是该方法的对象的锁
同步块
锁任意一个对象,锁的是需要操作的对象
lock
显式同步锁
需要手动开启锁,关闭锁
- 创建一个ReentrantLock锁
- 在try中调 lock() 加锁
- 在finally中调 unLick() 方法解锁
常见方法
sleep() 线程暂停多长时间,不会释放锁。
wait() 线程停止,释放锁。(解决线程之间的通信)
notifyAll() 唤醒线程。(解决线程之间的通信)
线程池
corePoolSize:线程池大小
maximumPoolSize:最大线程数(并发)
keepAliveTime:线程没有任务后保持多长时间终止
ExecutorService
真正的线程池接口。常见子类ThreadPoolExcutorexecute(Runnable run)
执行命令,没有返回值,一般执行Runnable
submit(Callable call)
执行命令,有返回值,一般执行Callable
shutdown()
关闭连接池
Executors(yi ke s kiu s)
工具类、线程池的工厂类,用于创建并返回不同的线程池。