gpt4 book ai didi

Java 多线程没有停止

转载 作者:行者123 更新时间:2023-12-02 08:50:33 25 4
gpt4 key购买 nike

我有以下用于扩展 Thread 类的“秒表”的代码:

package StopWatch;

//Code taken from:
//https://stackoverflow.com/questions/9526041/how-to-program-for-a-stopwatch

public class Stopwatch extends Thread {
private long startTime;
private boolean started;

public void startTimer() {
this.startTime = System.currentTimeMillis();
this.started = true;
this.start();
}

public void run() {
while(started){/*currentTimeMillis increases on its own */}
System.out.println("timer stopped");
}

public int[] getTime() {
long milliTime = System.currentTimeMillis() - this.startTime;
int[] time = new int[]{0,0,0,0};
time[0] = (int)(milliTime / 3600000); //gives number of hours elapsed
time[1] = (int)(milliTime / 60000) % 60; //gives number of remaining minutes elapsed
time[2] = (int)(milliTime / 1000) % 60; //gives number of remaining seconds elapsed
time[3] = (int)(milliTime); //gives number of remaining milliseconds elapsed
return time;
}

public void stopTimer() {
this.started = false;
}
}

我正在以下驱动程序类中测试它:

import StopWatch.Stopwatch;
public class StopWatchTest {
public static void main(String[] args) {
Stopwatch stopwatch = new Stopwatch();

stopwatch.startTimer();
int sum = 0;
for (long i = 0; i < 100000; i++) {
sum++;
}
int[] time = stopwatch.getTime();

for (int i = 0; i < 4; i++) {
if (i < 3) {
System.out.print(time[i]+":");
} else {
System.out.print(time[i]);
}
}
stopwatch.stopTimer();
}
}

我的目的是使用 Stopwatch 类的实例来测量各种代码块(例如驱动程序类中的 for 循环)的性能,方法是让主线程中的这些 Stopwatch 对象在执行之前在单独的线程中启动计时器我想要评估的代码块,然后让它们(秒表对象)在主线程中的所述 block 的执行完成后停止计时器。我知道有更简单和更容易的方法可以做到这一点,但我想尝试这样做作为一种“概念证明”,并简单地通过多线程变得更好,但我遇到了一些问题:

1) 当我运行驱动程序类 StopWatchTest 时,我每次都会得到看似随机且任意的输出(但大部分是 0:0:0:0)

2)主线程(或者可能是秒表线程,我什至不再确定)在我得到像 0:0:0:0 这样的输出后似乎永远不会停止执行

3)当我尝试使用断点等进行调试时,我会得到完全意想不到的行为,具体取决于我放置断点的位置(主线程有时会完成执行,但会随机输出,例如 0:0:13:2112 ,其他时候我会这样做)只是卡在秒表线程中)

第 3 点并不像第 1 点和第 2 点那样让我担心,因为我对当一个或多个线程在断点处暂停以进行调试时多线程的行为了解有限(我怀疑当我中断主线程时)线程秒表线程继续运行)。第 1 点和第 2 点更让我困扰,因为我不明白为什么会发生它们。

最佳答案

为了让您开始,您应该将 boolean 值标记为 volatile :

private volatile boolean started;

这应该可行,但它会造成一个繁忙的循环,这对 CPU 使用率非常不利。接下来您应该查看 wait()/notify() 方法。

关于Java 多线程没有停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60803768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com