gpt4 book ai didi

java - java线程同步

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:16:59 27 4
gpt4 key购买 nike

美好的一天!我遇到了关于在 java 中同步线程的问题。我正在开发创建计时器并允许重置、删除和停止的程序。只是为了学习如何使用线程。

问题是代码只在一段时间内提供同步...我无法理解我的错误。也许我的方法不对,所以我想知道如何解决这个问题。

我有下一个代码:

public class StopWatch
{
//Create and start our timer
public synchronized void startClock( final int id )
{
//Creating new thread.
thisThread = new Thread()
{
@Override
public void run()
{
try
{
while( true )
{
System.out.printf( "Thread [%d] = %d\n", id, timerTime );
timerTime += DELAY; //Count 100 ms
Thread.sleep( DELAY );
}
}
catch( InterruptedException ex )
{
ex.printStackTrace();
}
}
};

thisThread.start();
}


//Starting value of timer
private long timerTime = 0;
//Number of ms to add and sleep
private static final int DELAY = 100;

private Thread thisThread;
}

我这样称呼这个类:

StopWatch s = new StopWatch(1);
s.startClock();
StopWatch s2 = new StopWatch(2);
s2.startClock();

最佳答案

我想你可能误解了“同步”。

这并不意味着线程在完全同步的时间运行——而是一次只允许一个线程执行同步代码块。在您的情况下,“同步”没有区别,因为您是从同一线程调用 startClock 方法....

一般来说,Java(实际上是大多数高级语言)不可能保证两个线程在完全相同的时钟时间执行操作,即使你有多个内核,因为它们总是容易被操作系统延迟调度程序或 JVM 垃圾收集暂停等。

此外,Thread.sleep(...) 作为计时机制并不可靠,因为它 sleep 的时间只是近似值。你任由线程调度器摆布。

建议的解决方案:

使用System.currentTimeMillis()如果你想要一个独立于线程的计时机制。

关于java - java线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5264360/

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