Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 使用两个线程时如何在每次更改后打印值_Java_Multithreading - Fatal编程技术网

Java 使用两个线程时如何在每次更改后打印值

Java 使用两个线程时如何在每次更改后打印值,java,multithreading,Java,Multithreading,我有A级,我需要它来获取当前日期并修改它 public class A { private Calendar cal = Calendar.getInstance(); public void change() { try { cal.add(Calendar.MONTH, 1); Thread.sleep(1000); } catch (Exception e)

我有A级,我需要它来获取当前日期并修改它

public class A {

    private Calendar cal = Calendar.getInstance();

    public void change() {
        try
        {
            cal.add(Calendar.MONTH, 1);
            Thread.sleep(1000);
        }
        catch (Exception e)
        {
            System.out.println("Thread  interrupted.");

        }


    }
    public void print() {
       DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

       System.out.println("Current Date Time : " + dateFormat.format(cal.getTime()));
    }
}
在我的主函数中,我创建了一个类A的实例,还创建了两个线程:一个负责更改日期,另一个负责将日期打印到控制台(使用A的打印和更改方法)

我想让它做的是在每次更改后打印新的日期,但是我得到了相同的打印日期

public class Main {

    public static void main(String[] args) throws InterruptedException {
        A a = new A();
        Thread B = new Thread(new Runnable(){
            public void run() {
                for (int i = 0; i < 10; i++) {
                    a.print();
                }
            }

        });

        Thread C = new Thread(new Runnable(){
            public void run(){
                for(int i =0; i<10; i++) {
                    a.change();
                }

            }
        });
        synchronized (a) {
                B.start();
                C.start();

        }
    }
}

以下是您的代码的更新版本,它将适合您:

class A {

private BlockingQueue<Calendar> calList = new ArrayBlockingQueue<Calendar>(1);

public void change() {
    try {
        Calendar cal=Calendar.getInstance();
        while(true) {
            cal.add(Calendar.MONTH, 1);
            calList.add(cal);
            System.out.println("Adding month to date");
            Thread.sleep(1000);
        }
    } catch (Exception e) {
        System.out.println("Thread  interrupted.");

    }

}

public void print() throws InterruptedException {
    while(true) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        System.out.println("Current Date Time : " + dateFormat.format(calList.take().getTime()));
    }
}}

所以这里发生的是线程B在C开始之前首先运行。这里没有逻辑使这两个线程像标题所说的那样整齐地交错。你可以看看人们是如何做这种事情的。我建议你不要使用
SimpleDateFormat
Calendar
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。而是使用
LocalDateTime
DateTimeFormatter
,两者都来自。
class A {

private BlockingQueue<Calendar> calList = new ArrayBlockingQueue<Calendar>(1);

public void change() {
    try {
        Calendar cal=Calendar.getInstance();
        while(true) {
            cal.add(Calendar.MONTH, 1);
            calList.add(cal);
            System.out.println("Adding month to date");
            Thread.sleep(1000);
        }
    } catch (Exception e) {
        System.out.println("Thread  interrupted.");

    }

}

public void print() throws InterruptedException {
    while(true) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        System.out.println("Current Date Time : " + dateFormat.format(calList.take().getTime()));
    }
}}
public static void main(String[] args) throws InterruptedException {
    A a = new A();
    Thread B = new Thread(new Runnable() {
        public void run() {
            try {
                a.print();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

    Thread C = new Thread(new Runnable() {
        public void run() {
            a.change();
        }
    });
    B.start();
    C.start();

}