一、线程
1、概念
如果程序只有一条执行路径,那么该程序就是单线程程序
如果程序有多条执行路径,嘛呢该程序就是多线程程序
2、线程和进程的区别
进程:正在运行的程序时系统进行资源分配和调用的独立单位,每一个进程都有他自己的内存空间和系统资源。此外进程不是同时进行的,因为单CPU
线程:是进程种的单个顺序控制流,是一条执行路径
3、多线程的意义
多线程的存在,不是提高程序的执行速度,其实是为了提高应用程序的使用率,程序的执行其实都是在抢CPU资源,CPU的执行权
多个线程都是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权,但是不能保证哪一个线程能够在哪个时刻抢到,所以线程的执行有随机性
4、并行和并发
前者是逻辑上同时发生,指在某个时间内同时运行多个程序
后者是物理上同时发生,指在某个时间点同时运行多个程序
5、实现多线程程序的方法
1)继承Thread类(重写Thread类的run方法)
- 自定义MyThread继承Thread类
- 在MyThread类中重写run()
- 创建MyThread类的对象
- 启动线程对象(调用start方法)
2)实现Runnable接口
- 自定义MyRunnable实现Runable接口
- 在MyRunnable中重写run()
- 创建MyRunnable类的对象
- 创建Thread类的对象,并把第三步的对象作为构造参数传递
3)实现Callable接口
Collable:带泛型的接口
这里指定的泛型其实是call()方法的返回值类型
4)使用方法2的好处
可以避免由于Java单继承带来的局限性
适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想
5)使用方法3的好处和弊端
好处:
- 可以有返回值
- 可以抛出异常
弊端:
- 代码比较复杂,一般不用
6、线程调度
1)分时调度模型
所有的线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
2)抢占式调度模型
优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些
注意:Java使用的是抢占式调度模型
3)方法
public final int getPriority();//返回线程对象的优先级
public final void setPriority(int newPriority);//更改线程的优先级
注意:
- 线程的默认优先级是5
- 线程优先级的范围是1-10
- 线程优先级高仅仅表示线程获取的CPU时间片的几率高
4)线程的生命周期
新建:创建线程对象(new)
就绪:有执行资格(start()),没有执行权
运行:有执行资格,有执行权(run())
阻塞:由于一些操作让线程处于了该状态,没有执行资格,没有执行权,而另外一些操作去可以把它激活,激活后则处于就绪状态
死亡:线程对象变成垃圾,等待被回收
8、控制线程的方法
线程休眠:
public static void sleep(long millis);
线程加入:
public final void join();等待线程终止
线程让行:
public static void yield();暂停当前线程对象,并执行其他多个线程
后台线程:
public final void setDarmon(boolean on);
中断线程:
public final void stop();让线程停止,过时了还可以使用
public void interrupt();中断线程,把线程的状态终止,并抛出一个InterruptedException
获取线程的名称:
public final String getName();
设置线程的名称:
public final void setName(String name);
返回当前正在执行的线程对象:
public static Thread currentThread();
注意:
线程中有start和run方法,但二者有区别
strat():首先启动了线程,然后再由JVM去调用改线程的run()方法
run():仅仅是封装被线程执行的代码,直接调用的是普通方法
9、线程组
1)概述
把多个线程组合到一起
2)方法
public final ThreadGroup getThreadGroup();
10、线程池
1)概述
线程池里的每一个线程代码结束后,并不会死亡,二十再次回到线程池中成为空闲状态,等待下一个对象来使用
2)Executor产生线程池的方法
public static ExecutorService new CachedThreadPool();
public static ExecutorService new FixedThreadPool(int nThreads);
public static ExecutorService new StngleThreadExecutor();
这些方法的返回值时ExecutorService对象,该对象表示一个线程池
shutdown();结束线程池