进程:
一个进程就是一个独立的应用程序,独占一个内存空间。
不是绝对的同时而是cpu在进程间来回切换。
线程:
是进程内部一个独立的运行流程。
(一个进程的)所有线程共享内存空间的。
不是绝对同时,cpu在线程之间进行来回切换。
比进程切换性能高、消耗小。
调用start方法才是开启线程。
调用run方法虽然不报错,但是没有开启线程。只是相当于普通的方法调用。
实现线程的第二种方法,实现runnable接口
重写run()方法
将接口对象传人到线程中去
调用线程的start方法
线程五种状态;
1.新建状态--通过new的方式产生一个Thread对象
2.就绪状态--调用start,但是在start调用run方法之前
3.运行状态--调用run()方法
4.死亡状态--run()方法执行完。
5.中断状态--在运行状态中发生。
5.1
因为优先级的原因线程没有抢到cpu的执行,处于中断状态。(可以给线程设置优先级,最大10、最小1、默认5)
getPriority();返回线程的优先级。
setPriority();设置线程的优先级。优先级高并不意味着一定能先抢到cpu的执行,只是执行几率更高。
5.2 阻塞。
由于等待一个i/o操作时
5.3 休眠-- 调用thread的sleep()方法传人毫秒数让当前线程进入休眠状态。
5.4 等待/唤醒
Wait 、notify唤醒第一个调用wait方法的、notifyall 唤醒所有调用wait方法的。
5.5 挂起--yield()
强制让一个线程退出cpu的抢占。
线程安全性
当多个线程访问同一资源,才会发生线程安全性问题。
解决方法: 同步锁。 第一个线程做完才能做下一个线程。
Synchronized 在资源身上添加 (修饰符);
死锁:
当多个线程同步访问一对循环依赖的资源时,就可能发生死锁现象。
解决方案:
线程间通讯-- wait() notify() 只能写在同步方法或者同步块中