多线程编程
进程、线程、多线程概念
进程:一段程序执行的过程,是系统分配资源的单位。
进程与进程之间独立存在。
并发:同一时刻,CPU交替运行多个任务
并行:同一时刻,CPU运行多个任务(多个CPU)
线程:运行在进程的多个任务
进程:是系统分配资源单位
线程:执行单位
等待:
- 等待(需要唤醒)
- 阻塞(不需要唤醒)
- 休眠(不需要唤醒)seelp不会释放对象锁
进程的特点:
(1) 动态性
(2) 独立性
(3) 并发性
实现线程的方式
- 继承Thread类,声明为thread的子类。必须重写run()方法。无法继承其他类
Run()普通方法,start启动线程 - 实现runnable的接口,无法拿执行结果。Runnalbe可以做到资源复用。
- Callable 、Future实现
1/线程一旦定义出来,默认是采用线程的异步调用
//但是一旦在某一个线程中,对例外的线程执行的join();
//将会使线程的异步调用,转换为同步调用,调用线程将会处于"等待"状态1直到被调用的线程,代码执行完毕之后,调用线程才继续执行
如果join(10)方法中,传入参数,参数代表10毫秒之后可以被重新加入就绪状态。
public static void yield()。导致当前正在运行的线程让步于同优先级的正在等待安排的其它线程。将线程挂起,直到其他线程执行完毕之后,再继续执行!
Synchronized关键字
修饰方法,使方法变成同步方法,仅一个线程使用。
同步块:
Synchronized(同步内容){
需锁定的代码
}
同步内容:this当前对象
Synchronized用于修饰对象,表示开启对象本身的锁。
当多线程同时访问该对象,谁抢得了该对象的锁,谁就可以访问同步块的内容。
Synchronized修饰对象时,对象可以是自身,也可以是其他对象
Synchronized 也可以修饰成员方法,同样开启“自身对象的对象锁”。
多根线程同时访问该方法时,谁抢得了对象索,可访问该对象的该方法。
Synchronized 还可以修饰类方法(静态方法)此时开启Class对象的对象锁
当多线程同时访问该对象,谁抢得了该Class对象的锁,谁就可以访问该类的这个类方法。
Synchronized修饰类对象的时候,此时表示开启Class对象的对象锁。(类名.Class)
当多根线程同时访问该对象,谁抢得了该Class对象的锁,谁就可以访问该类的这个类方法。
如何选择同步块,或者同步方法:
1、 方法的执行范围,一定比某一段代码执行的范围大得多(锁的范围越大,)。操作代码的人越少。
2、 同步方法开启的对象锁,只能是本对象的,无法开启其他对象的。
**
线程之间的相互通讯(状态控制)
**
Wait()等待,处于等待状态的线程会释放对象锁。
Notify()唤醒处于等待状态的线程(唤醒的一定是调用该方法处于等待状态的线程)
notifyAll()唤醒所有处于被“相同的对象锁”不满足条件等待线程
java.uitl.concurrent包
线程池,存放一定数量线程的区域
守护线程是后台运行的线程。垃圾回收器就是一个典型的守护线程。
使线程暂停执行的条件
线程:-线程优先级比较低,因此它不能获得CPU时间。
-使用sleep( )方法使线程睡眠。
-通过调用wait( )方法,使线程等待。
-通过调用yield()方法,线程已显式出让CPU控制权。-线程由于等待一个1/O事件被阻塞。