抢红包
package com.chen.bao1;
import java.util.Random;
public class MyThread extends Thread {
//共享数据
static double money = 100;
static int count = 3;
//最小中奖金额
static final double MIN = 0.01;
@Override
public void run() {
synchronized (MyThread.class) {
if (count == 0) {
System.out.println(getName() + "没有抢到红包");
} else {
//设置一个红包金额
double price = 0;
if (count == 1) {
//最后一个红包
price = money;
} else {
//第一个红包,第二个红包
Random random = new Random();
double bounds = money - (count - 1) * MIN;
price = random.nextDouble(bounds);
if (price < MIN) {
price = MIN;
}
}
//减调中奖金额
money = money - price;
count--;
System.out.println(getName() + "抢到了" + price + "元");
}
}
}
}
package com.chen.bao1;
public class Test {
public static void main(String[] args) {
//创建线程对象
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
MyThread myThread3 = new MyThread();
MyThread myThread4 = new MyThread();
MyThread myThread5 = new MyThread();
//起名
myThread1.setName("张三");
myThread2.setName("李四");
myThread3.setName("王五");
myThread4.setName("刘六");
myThread5.setName("李齐");
//启动线程
myThread1.start();
myThread2.start();
myThread3.start();
myThread4.start();
myThread5.start();
}
}
抽奖箱抽奖
package com.chen.bao2;
import java.util.ArrayList;
import java.util.Collections;
public class MyThread extends Thread{
ArrayList<Integer> list;
public MyThread(ArrayList<Integer> list) {
this.list = list;
}
@Override
public void run() {
while (true){
synchronized (MyThread.class){
if (list.size()==0){
break;
}else {
//抽奖
Collections.shuffle(list);
int price = list.remove(0);
System.out.println(getName()+"又产生了一个"+price+"元的大奖");
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.chen.bao2;
import java.util.ArrayList;
import java.util.Collections;
public class Test {
public static void main(String[] args) {
//创建奖池
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,2,20,3000,476);
MyThread myThread1 = new MyThread(list);
MyThread myThread2= new MyThread(list);
myThread1.setName("抽奖箱1");
myThread2.setName("抽奖箱2");
myThread1.start();
myThread2.start();
}
}
package com.chen.bao2;
import java.util.ArrayList;
import java.util.Collections;
public class MyThread extends Thread{
ArrayList<Integer> list;
//线程1
static ArrayList<Integer> list1=new ArrayList<>();
//线程2
static ArrayList<Integer> list2=new ArrayList<>();
public MyThread(ArrayList<Integer> list) {
this.list = list;
}
@Override
public void run() {
while (true){
synchronized (MyThread.class){
if (list.size()==0){
if ("抽奖箱1".equals(getName())){
System.out.println("抽奖箱1"+list1);
}else {
System.out.println("抽奖箱2"+list2);
}
break;
}else {
//抽奖
Collections.shuffle(list);
int price = list.remove(0);
if ("抽奖箱1".equals(getName())){
list1.add(price);
}else {
list2.add(price);
}
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.chen.bao2;
import java.util.ArrayList;
import java.util.Collections;
public class Test {
public static void main(String[] args) {
//创建奖池
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,2,20,3000,476);
MyThread myThread1 = new MyThread(list);
MyThread myThread2= new MyThread(list);
myThread1.setName("抽奖箱1");
myThread2.setName("抽奖箱2");
myThread1.start();
myThread2.start();
}
}
另一种解法:
package com.chen.bao2;
import java.util.ArrayList;
import java.util.Collections;
public class MyThread extends Thread{
ArrayList<Integer> list;
public MyThread(ArrayList<Integer> list) {
this.list = list;
}
@Override
public void run() {
ArrayList<Integer> boxList=new ArrayList<>();
while (true){
synchronized (MyThread.class){
if (list.size()==0){
System.out.println(getName()+boxList);
break;
}else {
//抽奖
Collections.shuffle(list);
int price = list.remove(0);
boxList.add(price);
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.chen.bao2;
import java.util.ArrayList;
import java.util.Collections;
public class Test {
public static void main(String[] args) {
//创建奖池
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,2,20,3000,476);
MyThread myThread1 = new MyThread(list);
MyThread myThread2= new MyThread(list);
myThread1.setName("抽奖箱1");
myThread2.setName("抽奖箱2");
myThread1.start();
myThread2.start();
}
}
这种方法适应于多线程
package com.chen.bao2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建奖池
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,2,20,3000,476);
//创建多线程要运行的参数对象
MyCallable myCallable = new MyCallable(list);
//创建多线程运行结果的管理对象
FutureTask<Integer> ft1=new FutureTask<>(myCallable);
FutureTask<Integer> ft2=new FutureTask<>(myCallable);
//创建线程对象
Thread thread1 = new Thread(ft1);
Thread thread2 = new Thread(ft2);
//设置名字
thread1.setName("抽奖箱1");
thread2.setName("抽奖箱2");
//开启线程
thread1.start();
thread2.start();
Integer max1 = ft1.get();
Integer max2 = ft2.get();
System.out.println("抽奖箱1max:"+max1);
System.out.println("抽奖箱2max:"+max2);
}
}
package com.chen.bao2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Integer> {
ArrayList<Integer> list;
public MyCallable(ArrayList<Integer> list) {
this.list = list;
}
@Override
public Integer call() throws Exception {
ArrayList<Integer> boxList = new ArrayList<>();
while (true) {
synchronized (MyCallable.class) {
if (list.size() == 0) {
System.out.println(Thread.currentThread().getName() + boxList);
break;
} else {
//抽奖
Collections.shuffle(list);
int price = list.remove(0);
boxList.add(price);
}
}
Thread.sleep(100);
}
//把集合的最大值返回
if(boxList.size()==0){
return null;
}else {
return Collections.max(boxList);
}
}
}