我是Java新手,我想问一个更理论性的问题。我试图在一个用Java编写的工作程序上添加一个新特性。该程序的目的是在后台运行多个作业并检查它们的状态。状态可能是"Ready", "Waiting", "Running", "Stopped", "Done"
。我想要创建一个方法,它将根据正在运行的作业的状态将一些信息打印到输出。印刷规则:
"Started: " + job.getName()
。"Failed: " + job.getName()
。"Done: " + job.getName()
。在作业类中,我声明了两个变量:
private boolean startDisplay = false;
private boolean endDisplay = false;
我对所有的工作做了一个循环,检查它们的状态,并为每种情况打印适当的消息。另外,我将变量更新为true。但问题是它一遍又一遍地打印相同的字符串。所以我让这些变量是静态的:
private static boolean startDisplay = false;
private static boolean endDisplay = false;
但是,通过这种方式,它将只为一个作业(而不是为其他作业)打印start
和end
。我怎样才能打印每条信息一次?我曾想过使用hashmap,但它感觉不是OOP
的正确方式。
发布于 2018-11-09 12:52:17
根据我的猜测,您需要一个POJO类,如下所示:
package com.stackoverflow;
public class Job {
private String jobName;
private boolean startDisplay = false;
private boolean endDisplay = false;
private boolean doneDisplay = false;
public Job(String jobName) {
this.jobName = jobName;
}
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public boolean isStartDisplay() {
return startDisplay;
}
public void setStartDisplay(boolean startDisplay) {
this.startDisplay = startDisplay;
}
public boolean isEndDisplay() {
return endDisplay;
}
public void setEndDisplay(boolean endDisplay) {
this.endDisplay = endDisplay;
}
public boolean isDoneDisplay() {
return doneDisplay;
}
public void setDoneDisplay(boolean doneDisplay) {
this.doneDisplay = doneDisplay;
}
}
和一个类来管理你的POJO:
package com.stackoverflow;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
List<Job> jobs = new ArrayList<>();
for (int i = 0; i < 5; i++) {
jobs.add(new Job("Job" + (i+1)));
}
String prompt = "";
while (!prompt.equals("q")) {
Scanner scanner = new Scanner(System.in);
prompt = scanner.nextLine();
if (prompt.equals("q"))
System.out.println("Bye");
if (prompt.equals("1")) {
System.out.println("Checking Job1 " + jobs.get(0).getJobName());
System.out.println("Started: " + jobs.get(0).isStartDisplay());
System.out.println("Done: " + jobs.get(0).isDoneDisplay());
System.out.println("Finished: " + jobs.get(0).isEndDisplay());
System.out.println("Changing State of the job....");
jobs.get(0).setStartDisplay(true);
}
}
}
}
发布于 2018-11-09 12:55:02
尝试用volatile
关键字声明布尔变量。否则,主线程将无法可靠地看到其他线程所做的更改。
https://stackoverflow.com/questions/53232854
复制相似问题