dabocaiqq
dabocaiqq
采纳率66.6%
2020-05-23 14:35 阅读 106

高分悬赏:Java语言多线程倒计时怎么同步输出,怎么用多线程来实现

20

高分悬赏:Java语言多线程倒计时怎么同步输出,怎么用多线程来实现
高分悬赏:Java语言多线程倒计时怎么同步输出,怎么用多线程来实现

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    wojiushiwo945you 毕小宝 2020-06-03 18:58

    JUC 提供了很多同步工具,倒计时可以用 CountDownLatch 锁来实现,可以参考我的一篇文章:https://blog.csdn.net/wojiushiwo945you/article/details/103689220

    点赞 1 评论 复制链接分享
  • qybao qybao 2020-05-23 15:56

    题目不清楚,是多个线程同时打印倒计时,还是各个线程自己打印自己的倒计时?关键就是同步而已

    import java.util.Date;
    public class Sample {
        public static void main(String[] args) {
            Runnable r = new Runnable() { //多线程同时打印一个倒计时
                int seconds = 30; //倒计30秒
                public void run() {
                    int current = seconds;
                    while (current > 0) {
                        try {
                            synchronized(this) {
                                if (current == seconds) {
                                    Date d = new Date();
                                    System.out.printf("%s:倒数%d秒, time:%tT\n",
                                            Thread.currentThread().getName(), current, d);
                                    seconds--;
                                }
                                current = seconds;
                            }
                            Thread.sleep(1000);
                            synchronized(this) {
                                if (current == 0) {
                                    System.out.printf("%s:倒计时结束。\n", Thread.currentThread().getName());
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            for (int i=0; i<10; i++) { //多线程同时打印一个倒计时
                new Thread(r).start();
            }
    
            /* 多线程各自打印自己的倒计时
            Object locker = new Object();
            for (int i=0; i<10; i++) {
                new Thread() {
                    int seconds = 30;
                    public void run() {
                        while (seconds > 0) {
                            try {
                                synchronized(locker) {
                                    Date d = new Date();
                                    System.out.printf("%s:倒数%d秒, time:%tT\n",
                                            Thread.currentThread().getName(), seconds--, d);
                                }
                                Thread.sleep(1000);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.printf("%s:倒计时结束。\n", Thread.currentThread().getName());
                    }
                }.start();
            }
            */
        }
    }
    
    点赞 评论 复制链接分享
  • zhangzhouisme Ernest ZZ 2020-05-23 21:45
    public class ThreadSync {
        public static void main(String[] args) {
            // 开启5个线程,同步输出倒计时30s,
            threadMethod(5, 30);
        }
    
        // count 线程数量,seconds倒计时秒数
        public static void threadMethod(int count, int seconds) {
            // 格式化时间输出
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
            // 遍历线程
            for (int i = 0; i < count; i++) {
    
                // lambda 表达式实现函数式接口
                new Thread(() -> {
    
                    // 线程本地变量,线程安全
                    ThreadLocal<Integer> local = new ThreadLocal<>();
                    local.set(seconds);
    
                    while (true) {
    
                        System.out.println(String.format("线程:%s,倒计时:%d,当前时间:%s", Thread.currentThread().getId(),
                                local.get(), sf.format(new Date())));
    
                        if (local.get() == 0)
                            break;
    
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
    
                        local.set(local.get() - 1);
                    }
    
                }).start();
    
            }
    
        }
    
    }
    
    
    点赞 评论 复制链接分享

相关推荐