三天摸鱼 两天晒网 2021-12-17 14:36 采纳率: 100%
浏览 29
已结题

关于多线程取球放球的问题(语言-java)

学习多线程时,想写一个取球放球的代码,然后想要循环这个操作10次,但是最终只执行了1次。

以i++模拟放球,i--模拟取球

public class SyncTest {
    private static int i=0;
    static class Thread1 implements Runnable{

        @Override
        public  void run() {
            for (int a=0;a<10;a++){
                synchronized(this){
                    if (i > 0) {
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    i++;
                    notify();
                    System.out.println(i);
            }
        }
        }
    }
    static class Thread2 implements Runnable{

        @Override
        public  void run() {
            for (int a=0;a<10;a++) {
                synchronized (this) {
                    if (i == 0) {
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    i--;
                    notify();
                    System.out.println(i);
                }
            }
        }
    }
    public static void main(String[] args) {
        new Thread(new Thread1()).start();
        new Thread(new Thread2()).start();
    }
}

img

img

debug后发现两个线程都wait了。如果不在线程这两个线程终做循环,而是在主线程去循环创建线程可以达到效果,但是一直创建和销毁线程又不太好。

有什么更好的方法吗

  • 写回答

3条回答 默认 最新

  • Yokna 2021-12-17 17:39
    关注

    package com;

    import java.util.List;
    import java.util.Map;
    import java.util.function.Function;
    import java.util.stream.Collectors;

    /**

    • @Description:

    • @ClassName: test3

    • @Author: yokna

    • @Date: 2021/12/17 14:59

    • @Version: 1.0

    • /
      public class test3 {
      private static int i=0;
      private static String lock = "";
      static class Thread1 implements Runnable{

        @Override
        public  void run() {
            for (int a=0;a<10;a++){
                synchronized(lock){
                    if (i > 0) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    i++;
                    lock.notify();
                    System.out.println(i);
                }
            }
        }
      

      }
      static class Thread2 implements Runnable{

        @Override
        public  void run() {
            for (int a=0;a<10;a++) {
                synchronized (lock) {
                    if (i == 0) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    i--;
                    lock.notify();
                    System.out.println(i);
                }
            }
        }
      

      }
      public static void main(String[] args) {

        new Thread(new Thread1()).start();
        new Thread(new Thread2()).start();
      

      }

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月28日
  • 已采纳回答 12月20日
  • 创建了问题 12月17日

悬赏问题

  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计