Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用while循环从另一个类中的线程打印?(时间不一致)_Java_Multithreading_While Loop - Fatal编程技术网

Java 使用while循环从另一个类中的线程打印?(时间不一致)

Java 使用while循环从另一个类中的线程打印?(时间不一致),java,multithreading,while-loop,Java,Multithreading,While Loop,嗨,我正在尝试编写一个时钟,每500毫秒用一个线程交替1到0,然后在另一个类中以500毫秒的睡眠速率打印同一个线程。我是一个“线程新手”,需要一些帮助 线 在这种情况下,一个原语只有一个writer,如果您这样重写的话 clock = 1 - clock; 或 在这种情况下,您需要做的就是使字段不稳定。如果有多个写入程序,或更新多个字段或非基本字段,则需要使用同步或锁定 还有其他避免锁定的方法,但如何做到这一点取决于具体情况 在这种情况下,由于两次更新字段,因此需要使用适当的锁或同步。经验法则

嗨,我正在尝试编写一个时钟,每500毫秒用一个线程交替1到0,然后在另一个类中以500毫秒的睡眠速率打印同一个线程。我是一个“线程新手”,需要一些帮助

线
在这种情况下,一个原语只有一个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;