程序:一组独立功能的静态的计算机指令,还没有执行的一段代码。
进程:一次程序的动态的运行过程。他有就绪,阻塞,运行等状态。
进程:向系统申请资源的独立单位
案例:开了一个QQ,就是开了一个进程,再打开迅雷,又开了一个进程,那我们在QQ上可以传输文字,语音,广告弹出,理解为开一个线程,换句话理解就是线程是任务。一个进程可以管理多个线程,进程里面至少包括一条线程。通俗的将进程是领导,线程是员工,进程管理线程,进程本身不执行,只是为线程提供运行的环境申请内存空间。
多线程
- 一个进程里同时执行多个任务
- 一个进程里面至少有一个线程
- 开启多个线程是为了同时执行多个任务,也是同时执行多部分代码。
利弊
好处:解决 了我们多任务执行的问题。
弊端:线程切换话费额外的资源,同时切换也是一个耗时的步骤。
如何创建线程
- 将类声明为Thread的子类
- 然后这个子类重写run方法
- 创建子类对象
- 开启线程
一般来讲,耗时的方法都不放在主线程里
线程常用属性:name获取线程的名字,默认为Tread-x
这种方式开启线程,要求该类不能在继承其他的父类,因为Java是单继承,但是我们可以用接口的方式来扩展。
第二种方法:创建一个类,实现runnable接口,实现了run方法,创建线程Thread(myRunnable),开启
一般都是使用第二种方法创建线程,
注意:线程的开启使用start,而不是run,如果直接使用run,那程序的执行就和函数调用没有区别,一直在调用主线程。
线程的优先级
public static void main(String[] args) {
Test test = new Test("员工");
Test test1 = new Test("总经理");
Test test2 = new Test("董事长");
Thread thread = new Thread(test);
Thread thread1 = new Thread(test1);
Thread thread2 = new Thread(test2);
thread2.setPriority(Thread.MAX_PRIORITY);
thread1.setPriority(Thread.NORM_PRIORITY);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
thread1.start();
thread2.start();
}
}
调整一条线程的优先级只是提高CPU先执行这条线程概率,并不是百分百的先执行
线程安全
出现线程安全的条件
- 多个线程同时访问共享资源(共享数据)
- 操作共享数据的代码有多条
解决办法:
对于不能同步执行的代码,我们只要保证当有一个线程执行的时候,其他线程不能进入执行。
类似公共厕所,进入之后先上锁,离开时候再开锁,这个就保证里面只有一个人在使用。
Java中提供给我们一种“同步代码块”可以解决这个问题
好处:解决了线程安全的问题
坏处:相对降低了效率,因为每次都要判断是否有同步锁。