lab6

  1. GUI的误区
    1.1 使用Japel和JLabel时,画布顶部始终出现,JLabel表示的数字,但label未设置顶部位置坐标。
JLabel label0 = new JLabel("1");
label0.setFont(new Font("宋体", Font.BOLD, 20));
label0.setForeground(Color.RED);
label0.setBounds(100 + j * 10, 105 + dis * i, 100, 50);
jpanel.add(label0);

在这里插入图片描述
解决方案:
添加jpanel.setLayout(null);//作用是设置布局为 null

  1. repaint的使用,实时刷新画布。
Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      Visualize visualize = paint(ladderlist);

      @Override
      public void run() {
        visualize.repaint();
      }
    }, 0, 50);
  1. 遇到一件很迷的问题,在猴子进程或猴子生成器进程中打印吞吐率和公平性,程序会受到影响,但如果注释后程序正常执行。
    初步判断可能是时间分片的问题
public void print(Map<Monkey, Long> monkeytimeMap) {
    double totaltime = 0;
    long minbegin = 0;
    long maxend = 0;
    // 初步推断 因为我调用了monkeytimeMap monkeytimeMap里面调用了猴子 占用了部分线程时间
    for (Monkey m : monkeytimeMap.keySet()) {
      minbegin = m.getstarttime();// 可能占用了梯子吗?
      maxend = monkeytimeMap.get(m);
      break;
    }
    for (Monkey m : monkeytimeMap.keySet()) {
      if (m.getstarttime() < minbegin) {
        minbegin = m.getstarttime();
      }
      if (monkeytimeMap.get(m) > maxend) {
        maxend = monkeytimeMap.get(m);
      }
    }
    System.out.println("minbegin =" + minbegin);
    System.out.println("maxend =" + maxend);
    totaltime = (double) (maxend - minbegin) / 1000;
    System.out.println("吞吐率是" + (double) monkeycreate / totaltime);
    int currentnum = monkeytimeMap.keySet().size();
    int CN2 = currentnum * (currentnum - 1);
    // 计算不公平总和
    long sum = 0;
    for (Monkey m1 : monkeytimeMap.keySet()) {
      for (Monkey m2 : monkeytimeMap.keySet()) {
        if (!m1.equals(m2)) {
          long Y1 = m1.getstarttime();
          long Y2 = m2.getstarttime();
          long Z1 = monkeytimeMap.get(m1);
          long Z2 = monkeytimeMap.get(m2);
          if ((Y1 - Y2) * (Z1 - Z2) >= 0) {
            sum += 1;
          } else {
            sum += -1;
          }
        }
      }
    }
    double fair = (double) sum / CN2;
    System.out.println("公平性是" + fair);
  }
  1. 线程无法终止,所有猴子过岸后,程序依然在进行,GUI依旧在刷新。
    初步判断是run函数里面的while循环未终止。

  2. Lock机制
    参考链接:https://blog.csdn.net/strivenoend/article/details/80440884
    5.1 不上锁
    例如:如下图,如果对主程序不上锁,debug后可以立即执行getmonkeytimeMap()操作,并且直接从读取当前的内存。故monkeytimeMap值存储两只猴子,如果不是立即执行getmonkeytimeMap()操作,而是过一会执行,monkeytimeMap值将存储更多猴子,但未必是全部猴子。
    在这里插入图片描述
    在这里插入图片描述
    这就是著名的缓存一致性问题。通常称这种被多个线程访问的变量为共享变量。也就是说,如果一个变量在多个CPU中都存在缓存(一般在多线程编程时才会出现),那么就可能存在缓存不一致的问题。
      为了解决缓存不一致性问题,通常来说有以下2种解决方法:1.通过在总线加LOCK锁的方式。2.通过缓存一致性协议
      5.2 上锁后,debug后不可以可以立即执行getmonkeytimeMap()操作,需要等猴子生成器线程工作结束后才执行。
      如果在执行这段代码的过程中,在总线上发出了LCOK锁的信号,那么只有等待这段代码完全执行完毕之后,其他CPU才能从变量i所在的内存读取变量,然后进行相应的操作。这样就解决了缓存不一致的问题。
      在这里插入图片描述
    在这里插入图片描述

  3. 在ADT中重写equals的同时一定要Override hashCode方法。否则spotbugs会报错。
    在这里插入图片描述
    在这里插入图片描述

  4. 线程无法终止。原因是继承runnable,在main中使用了new Thread()
    在这里插入图片描述
    在这里插入图片描述
    应改为继承Thread

  5. git分支管理
    正确操作如下:(master不能为空,先在master分支上提交readme.md文件)
    在这里插入图片描述
    查看仓库Graph图的指令:

git log --graph --decorate --oneline --simplify-by-decoration --all

遇到的错误:

git pull
git add/rm某些合并失败的文件

参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344

  • ( 未解决)git merge之后,远程master分支未更改,需要执行:git push origin master远程分支才更改
    初步判断是:开始时在master分支上提交readme.md文件,使得master为空,直接在v1上提交文件,后使用git checkout -b master创建master分支,所以导致出错。
    解决方案是master不能为空,先在master分支上提交readme.md文件
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天才程序YUAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值