1、wait和sleep的区别
sleep: 不释放锁对象, 释放CPU使用权
在休眠的时间内,不能唤醒
wait(): 释放锁对象, 释放CPU使用权
在等待的时间内,能唤醒
2、有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:
抽奖箱1 又产生了一个 10 元大奖
抽奖箱2 又产生了一个 100 元大奖
//.....
package work;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Lottery implements Runnable{
private int arr[] = {10,5,20,50,100,200,500,800,2,80,300};
private int position = 0;//接受中奖位置随机数
//接受已中奖的位置
private ArrayList<Integer> list = new ArrayList<>();
//创建锁
Lock lock = new ReentrantLock();
public void run(){
while( list.size() != arr.length){
lock.lock();
position = new Random().nextInt(arr.length);
if (list.contains(position)) {
continue;
} else {
list.add(position);
}
try {
Thread.sleep(50);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "产生了一个"
+ arr[position] + "元大奖");
lock.unlock();
}
}
}
package work;
public class Work01 {
public static void main(String[] args) {
Lottery lottery = new Lottery();
Thread t1 = new Thread(lottery,"抽奖箱1:");
Thread t2 = new Thread(lottery, "抽奖箱2:");
t1.start();t2.start();
}
}
3、某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程,
并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。线程运行后打印格式如下:
编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
//.....
从后门入场的员工总共: 13 位员工
从前门入场的员工总共: 87 位员工
package work01;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class EmployeeEnter implements Runnable {
//前门统计
private int frontNum = 0;
//后门统计
private int backNum = 0;
//总人数
private int person = 100;
//锁
Lock lock = new ReentrantLock();
public void run() {
while(person > 1){
lock.lock();
try {
Thread.sleep(30);
//获取线程名字
String threadName = Thread.currentThread().getName();
//前门人数统计并输出每个通过的人
if( "前门".equals(threadName) ){
frontNum++;
System.out.println("编号为:"+(100-person+1)
+"的员工 从前门 入场! 拿到的双色球彩票的号码是:"+DoubleColorBall());
}
//后门人数统计并输出每个通过的人
if( "后门".equals(threadName) ){
backNum++;
System.out.println("编号为:"+(100-person+1)
+"的员工 从后门 入场! 拿到的双色球彩票的号码是:"+DoubleColorBall());
}
person--;
//最终统计
if(person == 0){
System.out.println("前门通过人数:"+frontNum);
System.out.println("后门通过人数:"+backNum);
}
} catch (Exception e) {
// TODO: handle exception
}finally{
lock.unlock();
}
}
}
//双色球彩票 出票
public List<Integer> DoubleColorBall(){
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 7; i++) {
list.add(new Random().nextInt(33)+1);
}
return list;
}
}
package work01;
public class Company {
public static void main(String[] args) {
EmployeeEnter enter = new EmployeeEnter();
Thread t1 = new Thread(enter, "前门");
Thread t2 = new Thread(enter, "后门");
t1.start();t2.start();
}
}