- 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
- repaint的使用,实时刷新画布。
Timer timer = new Timer();
timer.schedule(new TimerTask() {
Visualize visualize = paint(ladderlist);
@Override
public void run() {
visualize.repaint();
}
}, 0, 50);
- 遇到一件很迷的问题,在猴子进程或猴子生成器进程中打印吞吐率和公平性,程序会受到影响,但如果注释后程序正常执行。
初步判断可能是时间分片的问题
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);
}
-
线程无法终止,所有猴子过岸后,程序依然在进行,GUI依旧在刷新。
初步判断是run函数里面的while循环未终止。 -
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所在的内存读取变量,然后进行相应的操作。这样就解决了缓存不一致的问题。
-
在ADT中重写equals的同时一定要Override hashCode方法。否则spotbugs会报错。
-
线程无法终止。原因是继承runnable,在main中使用了new Thread()
应改为继承Thread -
git分支管理
正确操作如下:(master不能为空,先在master分支上提交readme.md文件)
查看仓库Graph图的指令:
git log --graph --decorate --oneline --simplify-by-decoration --all
遇到的错误:
-
执行git push出现"Everything up-to-date"
参考链接:
https://www.cnblogs.com/kevingrace/p/6259905.html -
Git - Your branch and ‘origin/xxx’ have diverged
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文件