Java学习 多线程 作业01

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();
	}

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值