多线程试题案例3

1.每个月的月末(02:00:00)执行一次代码

2.模拟售票

3.用15个线程实现,求123456789之间±和100的表达式(11结果,)如果一个线程求出结果,立即告诉其他停止

4.编写程序:实现三个线程,运行输出A1 B2 C3 A4 B5 C6…

每个月的月末(02:00:00)执行一次代码

public class Test1 {
    // 每个月的月末(02:00:00)执行一次代码
    public static void main(String[] args) {
        new Thread(() -> {
            while (true){
                try {
                    // TimeUnit.SECONDS.sleep(5);
                    // TimeUnit.DAYS.sleep(30);

                    var c = Calendar.getInstance();
                    // System.out.println(c.get(Calendar.MONTH) + 1);
                    c.set(Calendar.MONTH,c.get(Calendar.MONTH) + 1);
                    c.set(Calendar.DAY_OF_MONTH,0);
                    c.set(Calendar.HOUR_OF_DAY,2);
                    c.set(Calendar.MINUTE,0);
                    c.set(Calendar.SECOND,0);
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    // System.out.println(sdf.format(c.getTime()));
                    if (c.getTimeInMillis() == System.currentTimeMillis()) {
                        // 每月的月末,要执行的代码
                        System.out.println(sdf.format(c.getTime()));
                        System.out.printf("%1$tF %1$tT%n", System.currentTimeMillis());
                        // ---------------------每月的月末,要执行的代码
                        TimeUnit.SECONDS.sleep(2);
                    }
                    // System.out.printf("%1$tF %1$tT%n",System.currentTimeMillis());
                } catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
public class Test1_1 {

    // 每个月的月末(02:00:00)执行一次代码

    public static void main(String[] args) {
        new Thread(() -> {
            long start = System.currentTimeMillis();
            var c = Calendar.getInstance();
            c.set(Calendar.MONTH,c.get(Calendar.MONTH) + 1);
            c.set(Calendar.DAY_OF_MONTH,0);
            c.set(Calendar.HOUR_OF_DAY,2);
            c.set(Calendar.MINUTE,0);
            c.set(Calendar.SECOND,0);
            long end = c.getTimeInMillis();
            while (true){
                System.out.println("ok");
                try {
                    TimeUnit.SECONDS.sleep(end - start);
                    System.out.println("执行数据库备份命令!");
                    start = System.currentTimeMillis();
                    var cc = Calendar.getInstance();
                    cc.set(Calendar.MONTH,cc.get(Calendar.MONTH) + 1);
                    cc.set(Calendar.DAY_OF_MONTH,0);
                    cc.set(Calendar.HOUR_OF_DAY,2);
                    cc.set(Calendar.MINUTE,0);
                    cc.set(Calendar.SECOND,0);
                    end = cc.getTimeInMillis();

                } catch (Exception e){
                    e.printStackTrace();
                }
            }

        }).start();
    }
}

模拟售票

public class Test2 {

    // 模拟售票

    public static void main(String[] args) {
        Test2 t = new Test2();
        new Thread(t::out," 东风路").start();
        new Thread(t::out," 南阳路").start();
        new Thread(t::out," 瑞达路").start();
        new Thread(t::out," 科学大道").start();

    }


    List<String> set = new ArrayList<>();
    int num = 50;

    public Test2() {
        this.num = 50;
        for (int i = 0; i < this.num; i++) {
            set.add(String.format("%03d", i + 1));
        }
    }

    public Test2(int num) {
        this.num = num;
        for (int i = 0; i < this.num; i++) {
            set.add(String.format("%03d", i + 1));
        }
    }

    public void out() {
        Random rand = new Random();
        String t = Thread.currentThread().getName();
        while (this.set.size() > 0) {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            synchronized (this) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                try {
                    int index = rand.nextInt(this.set.size());
                    String p = this.set.get(index);
                    this.set.remove(p);
                    if (this.set.size() == 0) {
                        System.out.printf("%s:售出%s票,票已经售完。%n%n", t, p);
                    } else {
                        System.out.printf("%s:售出%s票,还有%d张票%n", t, p, this.set.size());
                    }
                } catch (Exception e) {
                    System.out.printf("%s:票已经售完。%n", t);
                }
            }
        }
    }
}

用15个线程实现,求123456789之间+-和100的表达式(11结果,)如果一个线程求出结果,立即告诉其他停止

public class Test3 {

    volatile List<String> list = new ArrayList<>();

    public static void main(String[] args) {

        /* 用15个线程实现,求123456789之间+-和100的表达式(11结果,)
         *  如果一个线程求出结果,立即告诉其他停止 */

        var t = new Test3();
        for (int i = 0; i < 15; i++) {
            new Thread(t::op,"T" + i).start();
        }

    }

    void op() {
        System.out.printf("%s 启动计算机中 %n", Thread.currentThread().getName());
        String[] o = new String[]{"", "+", "-"};
        Random rand = new Random();
        StringBuffer str = new StringBuffer("1");
        Pattern p = Pattern.compile("(\\d+|-\\d+)");
        stop:
        while (list.size() != 11) {
            for (int i = 2; i < 10; i++) {
                str.append(String.format("%s%d", o[rand.nextInt(o.length)], i));
                String s = str.toString();
                Matcher m = p.matcher(s);
                List<Integer> ln = new ArrayList<>();
                while (m.find()) {
                    ln.add(Integer.parseInt(m.group()));
                }
                int sum = ln.stream().reduce(0, Integer::sum);
                if (sum == 100 && !list.contains(s)) {
                    list.add(s);
                    System.out.printf("[%s]:%s = 100%n", Thread.currentThread().getName(), s);
                    break;
                } else {
                    str.delete(1,str.length());
                    break;
                }
            }
            System.out.printf("%s 结束 %n",Thread.currentThread().getName());
        }
    }
}

编写程序:实现三个线程,运行输出A1 B2 C3 A4 B5 C6...

public class Test4 {

    AtomicInteger num = new AtomicInteger(0);
    ReentrantLock lock = new ReentrantLock(true);

    public static void main(String[] args) {
        /* 编写程序:实现三个线程,运行输出A1 B2 C3 A4 B5 C6... */

        var t = new Test4();
        var a = new Thread(t::work,"A");
        a.start();

        var b = new Thread(t::work,"B");
        b.start();

        var c = new Thread(t::work,"C");
        c.start();
    }

    void work(){
        String tn = Thread.currentThread().getName();
        while (true){
            lock.lock();
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e){
                e.printStackTrace();
            }
            System.out.printf("%s%d ",tn,num.incrementAndGet());
            if ("C".equalsIgnoreCase(tn)){
                System.out.println();
            }
            lock.unlock();

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值