qaq
- 并发:在同一时刻,有多个指令在单个CPU上交替执行
- 并行:在同一时刻,有多个指令在多个CPU上同时执行
多线程的实现方式
继承Thread类
重写run方法
1 | //MyThread.java |
实现Runnable接口
重写run方法
1 | //MyRun.java |
利用Callable接口和Future接口
- 可以获取到多线程运行的结果
1 | //MyCallable.java |
常见成员方法
String getName():返回线程名字void setName(String name):设置线程名字,默认名字:Thread-X(X从0开始)static Thread currentThread():获取当前线程的对象static void sleep(long time):让线程休眠指定毫秒时间setPriority(int newPriority):设置线程优先级(1~10),默认是5。优先级越高,越容易抢到cpufinal int getPriority():获取优先级final void setDaemon(boolean on):设置为守护线程public static void yield():出让线程/礼让线程,出让当前cpu的执行权public static void join():插入线程/插队线程
调度
java中用的是抢占式调度,线程优先级越高,越容易抢到cpu
守护线程
当其他的非守护线程执行完毕后,守护线程会陆续结束
同步代码块
- 把操作共享数据的代码锁起来
- 锁默认打开,进去一个线程就关闭
- 里面线程出来再打开
1 | synchronized(锁) {//锁对象是任意唯一对象,可以用当前类的字节码文件(MyThread.class) |
同步方法
- 把synchronized关键字加到方法上
修饰符 synchronized 返回值类型 方法名(){}- 同步方法是锁住方法里面所有的代码
- 锁对象不能自己指定
- 当前方法非静态:this
- 当前方法静态:当前类的字节码文件对象
Lock锁
- JDK5以后有的
- 提供了获得锁和释放锁的方法
void lock():获得锁void unlock():释放锁
- Lock是接口不能直接实例化
1 | Lock lock = new ReentrantLock(); |
常见方法
用锁使用方法
void wait():当前线程等待,直到被其他线程唤醒void notify():随机唤醒单个线程void notifyAll():唤醒所有线程
阻塞队列
- 实现了
Iterable、Collection、Queue、BlockingQueue这些接口 - 有
ArrayBlockingQueue和LinkedBlockingQueue两种实现方式 - 不需要额外写锁
方法
put, ``
线程池
Executors
线程池的工具类通过调用方法返回不同类型的线程池对象
public static ExecutorService newCachedThreadPool():创建一个上限为INT_MAX的线程池对象public static ExecutorService newFixedThreadPool(int nThreads):创建有上限的线程池
成员方法
submit():提交任务shutdown():销毁线程池
线程池多大合适
- CPU密集型运算: 最大并行数 + 1
- I/O密集型运算: