多线程
1. 多线程
进程与线程
什么是进程
1.程序的指令和数据的集合,其本身没有任何的运行的含义,是一个静态的概念,
进程是程序在CPU上的一次执行过程 它是一个动态的概念
总结:进程具有一定独立功能的程序,是一个实体,在内存中每个进程都有自己的地址空间,互不影响
进程状态【图】
就绪 执行---堵塞
cpu的调度运算【图】
总结:进程是由cpu来分配资源的,同一时间只能调度员一个进程
知道:电脑上打开过个程序变卡的原因。
什么是线程
线程实际上是在进程的基础上的划分,一个进程启动后,里面的若干程序就会划分若干线程
【我们的教室当做一个进程,我们每一个学生当做一个线程,所有的线程都在做项目
每个学生写项目冲突么? 不冲突
每个学生是不是属于某一个教室? 线程属于某一个进程
每一个学生写项目的时候可不可以讨论? 可以
其中教室的教师机大家都可以访问吗? 可以 进程的资源共享
教室里真真做事的是谁? 学生【线程】
】
总结:线程是一个执行的路径,共享内存空间,线程之间可以互相切换,并发执行,一个进程至少需要一条线程
2. 线程的操作
1.继承Thread类
2.重写run()方法
public class Threads extends Thread{
@Override
publicvoid run() {
Threadt=Thread.currentThread();
for(inti=1;i<=10;i++){
System.out.println("当前线程编号"+t.getId()+"\t当前线程名"+t.getName()+"\t当前的线程状态"+t.isAlive()+"i="+i);
}
}
}
3. 线程的操作方法二
1.实现接口 runnable
2.重写run()方法
public class Runnables implements Runnable {
@Override
publicvoid run() {
Threadt=Thread.currentThread();
for(intj=1;j<=10;j++){
System.out.println("当前线程编号"+t.getId()+"\t当前线程名"+t.getName()+"\t当前的线程状态"+t.isAlive()+"j="+j);
}
}
}
4. 选哪种创建线程的方式好?
接口好:因为选了接口本类还可以继承其他类,提高了程序的扩展性。
其实Thread是线程 run是任务 第一种方式代表吧线程和任务变成一体
第二种方式将任务放入线程中等待cpu调度执行
5. 线程同步(线程安全)
当多个线程共性一个数据的时候出现的问题
多线程中要进行资源共享,就需要同步,一旦同步过多,就会出现死锁。
1.使用同步代码块
使用synchronized(Obj){执行的方法}
总结:锁住了当前的块 object对象就是锁 当前块获得了锁
缺点:牺牲了性能换取了安全,出现死锁的现象【无法解锁】
2.同步方法
使用:publicsynchronized 修饰方法
总结:锁住的是当前线程 创建当前的对象就是锁 当前创建的线程获得的锁
缺点:牺牲了性能换取了安全,出现死锁的现象【无法解锁】
3.Lock锁
使用:创建锁对象ReentrantLock
lock() 获得锁【上锁】
nulovk()释放锁
总结:上锁与解锁的时间由自己掌控,性能提高了
6.Thread类
构造方法
Thread(Runnable r) 分配一个新的线程对象
Thread(Runnable r,String name) 分配一个新的线程对象,为当前线程取一个名字
普通方法
static Thread currentThread() 返回当前正在执行线程的对象的引用
long getId(); 返回当前线程的表示符【编号】
String getName(); 返回当前线程的名称
boolean isAlive() 测试当前线程是否处于活动状态
static sleep(ms); 休眠指定的毫秒数后继续执行;
setPriority(int i) 更改当前线程的优先级【只是更改抢占cpu的资源的几率】
Thread.MAX_PRIORITY 10 设置当前线程可以具有最高优先级
Thread.MINPRIORITY 1 设置当前线程可以具有最高优先级
Thread.NORM_PRIORITY 5 设置当前线程可以具有最高优先级
也可以设置 1-10之间的值
interrupt(); 中断线程
setDaemon(boolean b) 设置当前的线程是否为守护线程【守护那些 非守护的线程都执行完 自己停止执行】
static yieId() 放弃当前抢占的cup资源 并执行其他线程
join() 等待该线程的终止
join(ms) 等待该线程最终执行时间的最大毫秒数 超出时间不在等待
wait()休眠等待,会让出所占用的CPU,并解锁
notify()唤醒休眠进程