根据其文档,System.nanoTime返回 纳秒,因为一些固定但任意的原始时间.但是,在所有x64机器上我尝试了下面的代码,有时间跳转,移动固定的原始时间.我的方法可能存在一些缺陷,使用替代方法(此处为currentTimeMillis)获取正确的时间.但是,测量相对时间(持续时间)的主要目的也会受到负面影响.
我在比较不同队列到LMAX的Disruptor时试图测量延迟时遇到了这个问题,我有时会出现非常负的延迟.在这些情况下,开始和结束时间戳由不同的线程创建,但延迟是在这些线程完成后计算的.
我的代码在这里花费时间使用nanoTime,计算currentTimeMillis时间中的固定原点,并比较调用之间的原点.因为我必须在这里提出一个问题:这段代码有什么问题?为什么会发现违反固定原产地合同的行为?或者不是吗?
import java.text.*;
/**
* test coherency between {@link System#currentTimeMillis()} and {@link System#nanoTime()}
*/
public class TimeCoherencyTest {
static final int MAX_THREADS = Math.max( 1, Runtime.getRuntime().availableProcessors() - 1);
static final long RUNTIME_NS = 1000000000L * 100;
static final long BIG_OFFSET_MS = 2;
static long startNanos;
static long firstNanoOrigin;
static {
initNanos();
}
private static void initNanos() {
long millisBefore = System.currentTimeMillis();
long millisAfter;
do {
startNanos = System.nanoTime();
millisAfter = System.currentTimeMillis();
} …Run Code Online (Sandbox Code Playgroud) 在 JDK 1.6.024 中,我们看到线程消耗接近 100% 的 CPUsetWakeupSocket0()用于套接字连接。这个本机方法被调用setWakeupSocket(),wakeup()在这个特定的SelectorImpl. 什么可能导致此方法卡住几分钟?
2019 年 2 月更新:我们还看到 JDK 1.8 较晚版本的执行时间延长。
我想有两个独立的线程运行不同类的两个不同的实例,我希望它们同时执行run命令.
我做了一个练习课,以证明我遇到的问题.一名赛车手向前跑,另一名则向后跑.
public class testCount {
public static void main(String args[]) {
testCount countCompetition = new testCount();
countCompetition.run();
}
public void run() {
(new Thread(new racer1())).start();
(new Thread(new racer2())).start();
}
public class racer1 implements Runnable {
public void run() {
for(int x = 0; x < 100; x++) {
System.out.println(x);
}
}
}
public class racer2 implements Runnable {
public void run() {
for(int y = 100; y > 0; y--) {
System.out.println(y);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的结果
1
2 …Run Code Online (Sandbox Code Playgroud) 我知道这是一个困难的问题,因为它不仅取决于休眠,还取决于我们使用它的特定方式。我们在应用程序中使用 hibernate 4,可能以错误的方式使用,但事实就是如此。
因此,我们加载整个类层次结构,并在一个大语句中连接子类表,并按 150K 行的顺序将其转换为对象。
由于对象有很多字段需要设置(~100),我们希望并行化迭代结果集并获取各个行的循环。这在休眠中可能吗?是否有一个时间点,Hibernate 已经从数据库接收到了所有结果,并且可以使用这些数据来水合对象,因此我们可以使用多线程来加速获取大型结果集?
这是否有意义,或者是否最好更改数据结构和映射以摆脱多表连接?
实际上,加载 150K 个这些对象需要一分钟或每个实体 0.3 毫秒。我们拥有包含更多条目的更简单的表,加载速度提高了一个数量级,为 0.02 毫秒/实体。在初始化阶段之后我们不会加载其他实体,整个数据库的初始化阶段需要超过 5 分钟。
如果我们通过将类层次结构不暴露给数据库来删除连接,并切换到基于组合的数据结构,我们可能会获得更简单的表加载,而不是复杂的连接,但代价是多个表加载,而不是一个将这些加载合并为一个的连接。
但问题仍然存在:如果我们要加载这么多行,并且在填写每个对象的字段时要调用相应的设置器,这可以并行完成吗?
这可能是一个非常新手的问题,但有没有办法启动一个创建套接字的线程?因为我不能做到以下几点:
public void run() throws IOException{
Socket sock2 = new Socket("localhost", 9898);
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
在CapitalizeClient中run()无法实现java.lang.Runnable中的run()重写方法不会抛出java.io.IOException
或者我应该只在主要创建套接字代码?我想定期创建用作心跳的套接字.谢谢
我试图制作一个8益智游戏,我的问题是,当x1的值让一个特定图像的x位置的70增加直到它达到170然后它将递减直到它再次达到70,但这个减少没有工作,图像不再移动到原来的位置,但它只是颤抖.为什么会发生这种情况.为了澄清所有这些内容,您可以查看下面的代码:
run.java
public class run extends Applet implements Runnable{
public Image im;
public int x1=70, y1=70;
public int x2=170, y2=70;
public int x3=270, y3=70;
public int x4=70, y4=170;
public int x5=170, y5=170;
public int x6=270, y6=170;
public int x7=70, y7=270;
public int x8=170, y8=270;
public int x9=270, y9=270;
public Image offscreen;
public Graphics d;
public BufferedImage container;
public BufferedImage[] tile = new BufferedImage[10];
private File loadThis;
public void combi1(){
if(x1<170 && x1>=70){
x1+=1; y2+=1; x5-=1; y4-=1;
return;
}
if(x1>=70){
x1-=1; …Run Code Online (Sandbox Code Playgroud)