A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

yueboqiushui

初级黑马

  • 黑马币:31

  • 帖子:13

  • 精华:0

题目意思如下:建5个线程,代表5个用户,3个红包,红包金额用1-10之间的随机整数代替,在控制台打印出 xx用户抢了xx块钱。
思路:建立5个线程,设置随机(Thread.sleep(rd.nextInt(300)+1)),最先唤醒的3个线程抢到红包。
我不知道思路对不对,我做到了建立5个线程,设置随机,后面就不知道怎么做了,求大佬帮忙补充或者用别的方式解答
[Java] 纯文本查看 复制代码
package com.lc.test20171007;

import java.util.Random;

/**
 * 建5个线程,代表5个用户,3个红包,红包金额用1-10之间的随机整数代替,在控制台打印出 xx用户抢了xx块钱
 * */
public class test05 {
	public static void main(String[] args) {
		Thread t1 = new Thread1();
		Thread t2 = new Thread2();
		Thread t3 = new Thread3();
		Thread t4 = new Thread4();
		Thread t5 = new Thread5();
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
	}
}
class Thread1 extends Thread {
	@Override
	public void run() {
		super.run();
		try {
			Random rd = new Random();
			Thread.sleep(rd.nextInt(300)+1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("1");
	}
}
	class Thread2 extends Thread {
		@Override
		public void run() {
			super.run();
			try {
				Random rd = new Random();
				Thread.sleep(rd.nextInt(300)+1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("2");
		}
	}

	class Thread3 extends Thread {
		@Override
		public void run() {
			super.run();
			try {
				Random rd = new Random();
				Thread.sleep(rd.nextInt(300)+1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("3");
		}
	}

	class Thread4 extends Thread {
		@Override
		public void run() {
			super.run();
			try {
				Random rd = new Random();
				Thread.sleep(rd.nextInt(300)+1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("4");
		}
	}

	class Thread5 extends Thread {
		@Override
		public void run() {
			super.run();
			try {
				Random rd = new Random();
				Thread.sleep(rd.nextInt(300)+1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("5");
		}
	}

8 个回复

正序浏览
wheat 高级黑马 2017-10-7 23:01:58
9#
共享资源建议用runable接口
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
tia 发表于 2017-10-7 21:08
加上一个同步语句块就行了。

多谢指点
回复 使用道具 举报
tia 初级黑马 2017-10-7 21:08:53
7#
加上一个同步语句块就行了。
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
public class MyThread implements Runnable{
        private int i = 0;
        private Random random = new Random() ;
        @Override
        public void run() {
                synchronized (this) {
                        if(this.i <3){
                                System.out.println(Thread.currentThread().getName() + "领取了" + (random.nextInt(10) + 1) + "元") ;
                                i ++ ;
                        }
                }
        }

}
public class MyThread implements Runnable{
        private int i = 0;
        private Random random = new Random() ;
        @Override
        public void run() {
                synchronized (this) {
                        if(this.i <3){
                                System.out.println(Thread.currentThread().getName() + "领取了" + (random.nextInt(10) + 1) + "元") ;
                                i ++ ;
                        }
                }
        }

}
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
yueboqiushui 发表于 2017-10-7 20:02
请问什么是不安全线程

给你看下我写的
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
tia 发表于 2017-10-7 19:52
使用不安全线程

请问什么是不安全线程
回复 使用道具 举报
优化了,应该算是完成了,用的Runnable接口
[Java] 纯文本查看 复制代码
package com.lc.test20171007;

import java.util.Random;

public class test06 {

	public static void main(String[] args) {
		Threads threads = new Threads();
		new Thread(threads, "A").start();
		new Thread(threads, "B").start();
		new Thread(threads, "C").start();
		new Thread(threads, "D").start();
		new Thread(threads, "E").start();
	}
}
//实现Runnable接口
class Threads implements Runnable {
	private int count = 3;// 红包个数

	@Override
	public void run() {
		Random random = new Random();
		//线程进来一次红包个数-1
		if (count-- > 0) {
			System.out.println("恭喜" + Thread.currentThread().getName()
					+ "用户抢到了" + (random.nextInt(10) + 1) + "块钱!");
		}
		Thread.yield();// 暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程
	}
}
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马