javaSe 线程练习

1、编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。打印顺序为12A34B56C….5152Z。即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替循环打印,直到打印到整数52和字母Z结束

    @Test//junit测试
	public void print()  {
		Print p = new Print();
		Thread t1 = new Thread(p);
		t1.setName("线程1:");
		Thread t2 = new Thread(p);
		t2.setName("线程2:");
		
		t1.start();
		t2.start();
	}

class Print implements Runnable{
	int m=1;
	@Override
	public void run() {
		while(true) {
			synchronized(this) {
				if(m>52) break;
				notify();
				if(m%2==0) {
					System.out.println(Thread.currentThread().getName()+(char)(m/2+64));
					m++;
				}else {
					System.out.println(Thread.currentThread().getName()+m+" "+ (m+1));
					m++;
				}
				
				try {
					wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
}

2、有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300}; 
        创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:
        抽奖箱1 又产生了一个 10 元大奖
        抽奖箱2 又产生了一个 100 元大奖

public class Hhreades {
	@Test
	public void show() {
		Jackpot j = new Jackpot();
		Thread t1 = new Thread(j);
		Thread t2 = new Thread(j);
		t1.setName("抽奖箱1");
		t2.setName("抽奖箱2");
		
		t1.start();
		t2.start();
	}
}

//做法一:

class Jackpot implements Runnable{
	int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
	List<Integer> list = new ArrayList<>(); 
	@Override
	public void run() {
		Random ran = new Random();
		int i=ran.nextInt(arr.length);
		while(true) {
			synchronized (this) {
					while(list.contains(i)) {
						 i = ran.nextInt(arr.length);
					}
					System.out.println(Thread.currentThread().getName()+String.format("又产生了一个 %s 元大奖", arr[i]));
					list.add(i);
				}
			}
		}
}


//做法二:

class Jackpot1 implements Runnable{
	int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
	List<Integer> list = new ArrayList<>(); 
	{
		for(int i=0;i<arr.length;i++) {
			list.add(arr[i]);
		}
	}
	@Override
	public void run() {
		Random ran = new Random();
		int i;
		while(true) {
			synchronized (this) {
				if(!list.isEmpty()) {
					i = ran.nextInt(list.size());
					System.out.println(Thread.currentThread().getName()+String.format("又产生了一个 %s 元大奖", list.get(i)));
					list.remove(i);
				}
			}
		}
	}
	
}

3、某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程,
并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。线程运行后打印格式如下:
编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
//.....
从后门入场的员工总共: 13 位员工
从前门入场的员工总共: 87 位员工
*
*双色球投注区分为红色球号码区和蓝色球号码区,红色球号码区由1-33共三十三个号码组成,蓝色球号码区由1-16共十六个号码组成。
*投注时选择6个红色球号码和1个蓝色球号码组成一注进行单式投注。

public class Thread2 {
	@Test
	public void main() {
		Meet m = new Meet();
		
		Thread t1 = new Thread(m);
		Thread t2 = new Thread(m);
		
		t1.setName("前门");
		t2.setName("后门");
		
		t1.start();
		t2.start();
	}
}
class Meet implements Runnable{
	List<Integer> red = new ArrayList<>();
	List<Integer> blue = new ArrayList<>();
	{
		for(int i=1;i<=33;i++) {
			red.add(i);
			if(i<=16) {
				blue.add(i);
			}
		}
	}
	int[] arr = new int[7];
	int num = 0;
	@Override
	public void run() {
		List<Integer> p = new LinkedList<>();
		while(true) {
			p.addAll(randomRed());
			p.add(randomBlue());
			
			synchronized(this){
				if(num >= 100) break;
				num++;
				System.out.println("编号为"+num+"的员工 从"+Thread.currentThread().getName()+" 入场! 拿到的双色球彩票号码是:"+ p.toString());
				p.clear();
				
			}
			
		}
	}
	public List<Integer> randomRed(){
		List<Integer> list =new ArrayList<>();
		Random r = new Random();
		while(list.size() < 6) {
			int a = r.nextInt(red.size())+1;
			if(list.contains(a)) {
				continue;
			}
			list.add(a);
		}
		return list;
	}
	public int randomBlue(){
		Random r = new Random();
		
		return r.nextInt(blue.size())+1;
	}
	
}

4、启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 
然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20….以此类推, 直到打印到75(老师说:三个交替没意义)

这种做法投机取巧了,网上还有高级做法

public class Thread3 {
	@Test
	public void main() {
		Print p = new Print();
		Thread t1= new Thread(p);
		t1.setName("1");
		Thread t2= new Thread(p);
		t2.setName("2");
		Thread t3= new Thread(p);
		t3.setName("3");
		
		t1.start();
		t2.start();
		t3.start();
	}
}
class Print implements Runnable{
	Object o = new Object();
	
	int num = 0;
	int j = 0;
	int m = 1;
	@Override
	public void run() {
		while(true) {
			 synchronized (o){
				 int id = Integer.valueOf(Thread.currentThread().getName());
				 if(id==m) {
					if(num >= 75) {
						break;
					}
					for(int i=1;i<6;i++) {
						num++;
						System.out.println("线程"+id+":"+(j*5+i));
					}
					j++;
					m++;
					if(m==4) m=1;
					o.notifyAll();
				}else {
					try {
						o.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			 }
		}
	}
	
}

5、两个用户交替向同一个账户存钱各3次,每次1000元,并打印余额

public class Thread6 {
	@Test
	public void main() {
		Accounts ac = new Accounts();
		User u = new User();
		u.init(ac);
		Thread t =new Thread(u,"用户1");
		Thread t2 =new Thread(u,"用户2");
		t.start();
		t2.start();
	}
}
class Accounts {
	int balance;
	public synchronized void add() {
		notify();
		balance+=1000;
		System.out.println(Thread.currentThread().getName()+"当前余额:"+this.balance);
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}
	
}
class User implements Runnable{
	Accounts ac;
	public void init(Accounts ac) {
		this.ac = ac;
	}
	@Override
	public void run() {
		for(int i=1; i<=3;i++) {
			ac.add();
		}
	}
	
}

 

抽奖之星是一款简单好用的随机抽奖软件。软件可用于各种活动和晚会、年会抽奖,支持文字抽奖、图片抽奖等多种模式,还内置作弊内定、黑白名单、名单分组等诸多功能。软件界面美观简洁、使用方便,速度快,质量高,对于用户来说是一款很不错的软件,小编这里推荐大家使用这款软件! 抽奖之星基本简介 抽奖模式:含文字抽奖、照片抽奖两种模式。 重复中奖:采用禁止重复中奖算法,自动滤除已经中奖的参选者。 随机抽取:随机滚动显示参选者(姓名、号码、照片等)。 按键方便:按回车开始滚动,按空格停止滚动,按Tab键播放颁奖音乐。 名单导入:导入文本文件,或导入图片文件夹,最多可导入高达2万条。 抽奖结果:自动保存抽奖结果,不惧死机断电,支持缺席等的作废处理。 灵活易用:无需预先固定中奖数量,手动切换当前奖项,设置每次抽取个数(1-50)。 背景音乐:支持滚动音乐、中奖音乐、颁奖音乐,并附带了相关音乐资源。 辅助工具:附带了图片批量缩小、号码座位号批量生成、强大的纯文本编辑、多列表格数据导入导出、格式转换等免费工具。 抽奖之星的安装 把下载好的安装包解压到当前文件夹,之后双击【cjzx.exe】运行文件进行安装,打开的时候会出现安装框,依次开始安装,依照步骤点击下一步,并选择同意协议和软件安装位置即可。 抽奖之星的使用   安装完成后,点击【抽奖之星】快捷方式即可进入抽奖之星软件。如图所示,这是软件的主界面。     如图所示,这是软件的界面布局介绍。用户可以点击界面的各种按钮实现自己所需要的各种功能。     如图所示,这是软件的文字中奖名单模式。     如图所示,这是软件的文字图片名单模式。     如图所示,这是软件的播放总名单模式显示。软件的功能就大致介绍到这里了,软件其余的具体功能就有小伙伴们自己去发掘吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值