线程与进程
线程与进程的概念
1、进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,-一个运行的exe就是一个进程。
2、线程:指进程中的一一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。
3、线程总是属于某个进程,进程中的多个线程共享进程的内存。进程中被启动的第一个线程被称为主线程,随后启动的线程都是子线程。
创建线程
1、创建线程类一
创建类继承thread类
重写run()方法
启动线程
- 执行线程类对象的实例化方法start()启动线程
- 启动线程后,会运行线程类中的方法run(),该方法会运行在子线程中
2、创建线程类二
创建类实现Runnable接口
实现run()方法
启动线程
- 创建自定义类对象
- 创建Thread对象(将自定义类对象作为参数传入)
- 调用Thread对象的实例方法start()
两种创建线程方式的比较
●使用继承Thread的方法创建
优点:编码简单
缺点:扩展性较差,如果一个类继承了Thread类,那么他就无法再继承其他类了。
●使用实现Runnable接口的方式创建
优点:不论你的类是否有继承其他类或者实现其他接口,都可以实现Runnable接口。扩展性较好。
缺点:代码稍微复杂
线程休眠
●Thread.sleep(静态方法强制当前正在执行的线程休眠(暂停执行), 以“减慢线程”。
●线程睡眠的原因:线程执行太快,或者需要强制进入下一-轮。 释放CPU资源,让其他线程有更多的机会执行。
线程同步
线程同步的必要性
当多个线程操作同一个变量,造成该变量的未知性
使用synchronized关键字可以实现线程间的同步。
synchronized可以同步
实例方法
类方法
代码块
同步实例方法
使用synchronized修饰实例方法
语法:synchronized <返回类型> <函数名>()
使用synchronized修 饰实例方法的效果
同一个对象的该实例方法,在同一时刻只能被一个线程执行。
只对同一个对象调用一个方法时生效
同步类方法
使用synchronized修 饰类方法
语法:static synchronized <返回类型> <函数名>()
使用synchronized修饰类方法的效果该类方法,在同一时刻只能被一个线程执行
同步代码块
可以让一个方法中部分代码被同步,多个线程不能同时访问代码块,会阻塞等待。
语法:synchronized (Object的对象){代码块}
使用同一一个对象访问该代码块时,同步才生效