Java 使用while循环从另一个类中的线程打印?(时间不一致)
嗨,我正在尝试编写一个时钟,每500毫秒用一个线程交替1到0,然后在另一个类中以500毫秒的睡眠速率打印同一个线程。我是一个“线程新手”,需要一些帮助 线Java 使用while循环从另一个类中的线程打印?(时间不一致),java,multithreading,while-loop,Java,Multithreading,While Loop,嗨,我正在尝试编写一个时钟,每500毫秒用一个线程交替1到0,然后在另一个类中以500毫秒的睡眠速率打印同一个线程。我是一个“线程新手”,需要一些帮助 线 在这种情况下,一个原语只有一个writer,如果您这样重写的话 clock = 1 - clock; 或 在这种情况下,您需要做的就是使字段不稳定。如果有多个写入程序,或更新多个字段或非基本字段,则需要使用同步或锁定 还有其他避免锁定的方法,但如何做到这一点取决于具体情况 在这种情况下,由于两次更新字段,因此需要使用适当的锁或同步。经验法则
在这种情况下,一个原语只有一个writer,如果您这样重写的话
clock = 1 - clock;
或
在这种情况下,您需要做的就是使字段不稳定。如果有多个写入程序,或更新多个字段或非基本字段,则需要使用同步或锁定
还有其他避免锁定的方法,但如何做到这一点取决于具体情况
在这种情况下,由于两次更新字段,因此需要使用适当的锁或同步。经验法则是:对线程之间共享的状态的所有访问都必须以同步方式完成。这里的共享状态是
时钟
字段。将其设置为公共是您遇到的最大错误,因为您无法同步对公共字段的访问。封装在OO设计中是至关重要的,在处理并发性时更是如此。如果您是在间隔时间运行任务,不要启动等待的线程,而是使用。这将有助于编写更好的代码,300毫秒的睡眠时间在计算机时间中是一个非常长的时间。感谢您的回答,正如我所说的,我是线程新手,不知道同步访问是如何工作的。这是我第一次尝试使用线程,我不确定如何与它的等待时间共享我的线程输出。我知道300毫秒是很长的等待时间。但是,我使用这个示例来测试和理解线程,因此出于测试目的,我希望在300毫秒的等待时间内显示另一个类中的线程,以便了解如何同步一个单独类中线程的输出。我不同意。使变量易变不会使clock++;时钟=时钟%2代码>原样的原子。阅读线程不应该看到2。只有0或1。当然,只使用volatile就可以使其线程安全,但是一旦计算了新值,代码就必须更改为只分配新值。
public class chipClass3 {
private clockThread clck;
private int clock = 0 ;
public chipClass3(){
clck = new clockThread();
}
public static void main(String[]args ){
chipClass3 chip = new chipClass3();
new Thread(chip.clck).start();
chip.printClock();
}
private void printClock() {
while(true){
System.out.println(getClock());
}
}
public int getClock() {
return clock;
}
public void setClock(int clock) {
this.clock = clock;
}
}
clock = 1 - clock;
clock ^= 1;