黑马程序员技术交流社区

标题: 小白求指导,今天笔试没做完的一题, [打印本页]

作者: yueboqiushui    时间: 2017-10-7 19:09
标题: 小白求指导,今天笔试没做完的一题,
题目意思如下:建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");
                }
        }


作者: tia    时间: 2017-10-7 19:52
使用不安全线程

作者: yueboqiushui    时间: 2017-10-7 20:00
优化了,应该算是完成了,用的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();// 暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程
        }
}

作者: yueboqiushui    时间: 2017-10-7 20:02
tia 发表于 2017-10-7 19:52
使用不安全线程

请问什么是不安全线程
作者: tia    时间: 2017-10-7 21:06
yueboqiushui 发表于 2017-10-7 20:02
请问什么是不安全线程

给你看下我写的

作者: tia    时间: 2017-10-7 21:07
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 ++ ;
                        }
                }
        }

}

作者: tia    时间: 2017-10-7 21:08
加上一个同步语句块就行了。

作者: yueboqiushui    时间: 2017-10-7 21:52
tia 发表于 2017-10-7 21:08
加上一个同步语句块就行了。

多谢指点
作者: wheat    时间: 2017-10-7 23:01
共享资源建议用runable接口





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2