线程和进程 线程:就是最小的执行单元,就是一个方法 进程:程序加载进入到内存后,形成程序 就叫进程
2.并发和并行 1.并发:同一时间端,执行程序,快速切换
2.并行: 同一时刻,同时执行
3.创建线程的两种方式 1.extends Thread (略) 2.implements Runnable 3.callAble (实现的第三种方式) 4.多线程执行的调度 1. 平均分配 (每个人平均分一个执行时间) 2.抢占式分配:大家来抢夺资源 5.多线程执行的内存图 每次打开线程就开启一个新的栈空间 栈空间中的方法,就是栈帧--> 包含着所有方法所需要的数据 6. 多线程的随机性
java采用的是抢占式资源,到底执行哪个线程,其实是依赖于cpu 去分配执行的资源,cpu分配到了谁,这事是随机,所以执行的效果也是随机的 7.多线程的安全问题 1.当多个线程在操作同一个共享数据时,就有可能会发生线程安全问题 解决多线程安全问题的方案: 1. synchronized 同步代码块:比同步方法更加的灵活,隐式锁(看不到拿锁还锁等过程) 2. synchronized 同步方法 非静态方法(this) 静态方法锁:(类的class文件 反射) 3.lock 4.atomic 保证了原子性 速度超级快,采用乐观锁的思路 (让你去做这件事,但是呢,不能保证你能做成功,如果失败了呢,那你就再做一次),同时还是拽着cpu 去做乐观锁这事 cas 线程池 1. 为什么要使用线程池 线程的频繁创建和销毁是非常消耗性能的,为了不让他频繁的创建和销毁,我们就想到了使用线程池--> 在底层搞一个集合,将线程放置到 线程池中,要使用时,将其取出,用完之后放回到对应的集合中 2. 线程池的使用步骤 1.创建线程池 ExecutorService es = Executors.newFixedThreadPool(int 参数) 参数:是创建这个线程池的线程数量 2. es.submit(任务) ,用线程池中的线程去执行对应的任务 注意:这个任务必须是Runable 的子类
|