线程
进程概述:
运行状态下的应用程序,进程是最基本的资源分配单位
特性:动态性、独立性、并发性
并发性与并行性区别
并发:
同一时间CPU交替运行多个任务
并行:
同一时间CPU同时运行多个任务
线程概述:
运行在进程中的任务,有的进程只有一个线程,也有的进程有多个线程,与进程不同的是线程是执行单位(CPU调度单位)
线程实现方式:
1.继承Thread类(不被推荐),因为在java中,只能够单继承,此处继承了Thread类之后就不能再继承其它类
2.实现Runable接口(较为推荐)
3.实现Callable接口,来自于jdk1.5之后;Callab与feature配合使用。(子线程结束完之后,才执行main())
Runable与Thread区别:
1.Runable解决了Thread单继承问题
2.Runnable资源复用性高
线程存在的状态: 新建、就绪、运行、睡眠(调用线程sleep()方法)、
等待(调用Object的wait()方法)、阻塞、挂起(调用yield()方法,让出CPU控制权)、死亡
线程的优先级:
线程优先级,也可以说是线程被CPU选中执行的概率
最高优先级:10
默认优先级:5
最低优先级:1
setPriority();//设置线程优先级
synchronized关键字
1.修饰对象表示开启对象本身的对象锁 synchronized(对象){},可以修饰本类对象自身,也可以修饰其他对象;{}里面代码叫同步代码,整个结构称为同步块,当多跟线程同时访问该对象,谁抢到了该对象锁,谁就可以访问同步块的代码
2.修饰成员方法,同样是开启自身对象的对象锁(synchronized修饰的方法不能被继承),当多跟线程同时访问该方法的时候,谁抢到了该对象锁,谁就可以调用该方法
3.修饰静态(类)方法,此时开启的是Class对象的对象锁,当多跟线程同时访问该方法的时候,谁抢到了该Class对象的对象锁,谁就可以访问该类的(静态)类方法
4.当Synchronized修饰类对象(类.Class)时候,表示开启Class对象的对象锁 synchronized(类.Class){},当多跟线程同时访问同步块的时候,谁抢到了该Class对象的对象锁,谁就可以访问同步块的代码
如何选择同步块或者同步方法(Synchronized修饰对象还是方法)
1.方法执行时间一定比其中某一块代码执行时间长的多(锁的范围越大,能够操作代码的人就越少)
2.同步方法开启的对象锁只能是本对象的,不能开启其他对象的
线程同步情况下状态相互通讯方法
调用wait();notify();notifyall();这三个方法
wait():让不满足对象条件的线程处于等待状态
notify():唤醒处于等待状态的线程
notifyall():唤醒因不满足相同对象的条件而处于等待状态下的所有线程
线程池
Exectors提供了四种线程池
1.newCachedThreadPool
创建一个可根据需要创建新线程的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
2.newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
3.newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行
4.newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO(新进先出)、LIFO(后进先出)、优先级)执行