多线程编程
线程是什么 :是进程内部独立运行的流程!
多进程特点:1-个进程是一个独立的应用程序
2-独占内存空间
3-同时运行不是绝对意义上的同时,而是cpu在进程中来回的切换!
多线程特点:1-线程是共享内存的空间
2-cpu在线程之间来回切换
3-线程是最小的处理单位
4-线程可共享相同的地址空间并且共享同一个进程!比进程的效率高得多
如何开启多线程
第一种开启方式
1建立一个类,并且继承Thread 并且重写run方法,这个run方法想当于main方法
2在main方法中产生子线程对象 ThreadA ta=new ThreadA();
3开启线程 ta.start(); 调用start方法开启线程 开启步骤 先分配空间,开启线程,调用run()方法; 分别在两个方法中打印一句话,,,,
会随机交叉显示
4如果只调用ta.run() 方法 的话 效果不同 直接调用的话没有开启线程和分配空间的动作
并且 如果在两个方法中各自打印一句话 ,它的输出结果会先打印run方法内容在打印start方法内容,只相当于普通方法调用
第二种开启方法
如果第一种有继承的父类就是用第二种方法
1书写一个类 并且实现 Runnable接口,实现该接口的run方法
2ThreadB tb=new Thread();
3Thread th=new Thread(tb); 这句代码意思是调用tb的 run方法 如果不传入tb他会调用自身的run方法
4调用线程的start方法
线程的生命周期 五种状态
1新建状态
2就绪状态
3运行状态 在程序运行中可能会处于中断状态 ,处于之后会回到运行状态 抢占cpu失败
4死亡状态.
线程优先级一共有10级 最大就是 10级最小1级 默认5级
设置级别 优先级高只是说受到cpu执行顺序靠前,并不是执行完优先级高的再执行优先级低的 设置的方法 xx.priority(1-10);
造成中断状态五种原因
1因为优先级的原因 ,没有抢占到cpu;
2阻塞:由于线程在执行输入输出的io时间是会中断
3休眠:让当前线程进入休眠状态 Thread.sleep(传入毫秒数)不是说休眠时间到了就马上被执行,它任然会进入cpu的抢占状态
4等待唤醒: 先调用 wait 方法 在调用唤醒 notify()方法
5挂起: Thread.yield()方法
线程的安全性的问题
线程安全:运行效率降低 当多个线程访问同一资源才会发生线程安全的问题
解决方法:在资源上加上 同步锁 谁先进入资源 谁进入同步锁 就会执行完 该 线 程的行为在执行后面的线程
资源锁 synchronized 加在资源身上的 被称为同步方法 谁先进入谁就先执行并且执行完在轮到下一个线程 效率降低
同步块
在调用出加上 synchronized(this.属性名){
}
死锁:当两个或多个线程同步访问一对循环依赖的资源是可能会发生死锁现象!
解决办法
:线程通讯 wait() 和Notify()方法
1-这两个方法只能写在同步方法或则同步块中
守护线程 : 子线程
特点 :只有在主线程未被执行时才会执行守护线程
主线程结束守护线程也会跟着结束!
小练习 龟兔赛跑 乌龟一次跑1步,兔子一次跳5步 ,总共路程为5000步 兔子在2500步的时候要休息10毫秒,用程序模拟
第二题 小王和小名两人同时比赛吃饺子 小王吃一个休息500毫秒 小明吃一个休息200毫秒 用代码模拟结果并输出他们吃的个数!