多线程1
来源:互联网 发布:矢量数据的拓扑结构 编辑:程序博客网 时间:2024/06/09 15:27
wait和sleep的区别
① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。
② 锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
③ 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
synchronized(x){
x.notify()
//或者wait()
}
1. 新建(new):新创建了一个线程对象。
2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
3. 运行(running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
4. 阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:
(一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
5. 死亡(dead):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
3、有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300};创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:
抽奖箱1 又产生了一个 10 元大奖
抽奖箱2 又产生了一个 100 元大奖
package ex;import java.util.Random;public class luckDraw extends Thread {private int[] arr = { 10, 5, 20, 50, 100, 200, 500, 800, 2, 80, 300 };//奖金个数private int num = arr.length;private boolean[] flag = new boolean[num];public void run(){while(true){synchronized (this) {if(num>0){Random r = new Random();int index = r.nextInt(arr.length); //如果下标为索引的标记数组为false,代表不重复if(!flag[index]){ //将下标下的标记数组设为true,代表已经用过flag[index] = true;System.out.println(Thread.currentThread().getName() + "又产生了"+ arr[index] + "元大奖");num--;}}}}}}
package ex;import java.util.concurrent.Executors;public class threadEx {public static void main(String[] args) {Thread t1 = new Thread(new luckDraw());t1.setName("抽奖箱1");Thread t2 = new Thread(new luckDraw());t2.setName("抽奖箱2");t1.start();t2.start();}}
- 多线程(1
- 多线程---- 1
- 多线程1
- 多线程1
- 多线程1
- 多线程1
- 多线程-1
- 多线程1
- 多线程1
- 多线程1
- 多线程(1)
- 多线程1
- 多线程1
- 多线程1
- 多线程 1
- 多线程-1
- 多线程 1
- 多线程1
- andriod studio 卡在wating for target device to come
- HDU 4352 数位DP + LIS
- Linux开发环境搭建02---VMware 12 上安装Ubuntu14.04
- 深度学习与计算机视觉之Python基础学习
- CSU-ACM2017暑期训练16-树状数组 D
- 多线程1
- jzoj5271 神奇的救火现场 (寻找性质dp)
- start
- java动态代理(JDK和cglib)
- vim常用命令
- vuejs之路之--条件渲染
- 成员变量和局部变量的区别
- 1014. Waiting in Line (30)
- jquery遍历筛选数组的几种方法和遍历解析json对象