Java 使用两个线程时如何在每次更改后打印值
我有A级,我需要它来获取当前日期并修改它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)
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();
}