我正在尝试为我的用户编写一个库,并希望它尽可能地易于使用。现在,要使用它,你必须开始一个新的线程,并设置很多变量来跟踪,在你的主类中,但是我的用户并不总是有Java经验,并且线程可能对我的一些用户来说太难了
所以我想将整个线程移动到我的类中,并允许用户调用一个函数来启动线程。
以下是我目前在主要课程中运行的主题:
int valueToAdd = 0;
DreamStatsTracker tracker = new DreamStatsTracker();
StartSessionResponse response = tracker.StartSession("ae-13s-90-11", "Abe");
System.out.println(response.getMessage());
System.out.println("Adding skill Herblore");
String message = tracker.AddSkill(response.getSessionId(), Skill.HERBLORE, "Abe");
Thread thread = new Thread(() -> {
while(true) {
tracker.SetValueForSkill(response.getSessionId(), Skill.HERBLORE, valueToAdd);
}
});
我想将整个事情移到DreamStatsTracker
类中,并从主类中执行类似的操作:
DreamStatsTracker tracker = new DreamStatsTracker();
tracker.AddSkill(Skill1, ValueForSkill1);
tracker.AddSkill(Skill2, ValueForSkill2);
tracker.Start();
这将启动DreamStatsTracker
的新实例,它将启动一个新线程,并在主类运行时在后台持续跟踪添加技能的值。
我该如何处理,甚至可能?
答案 0 :(得分:0)
我通过几个小时的测试和尝试终于解决了我的问题。
这就是我所做的:
跟踪器类:
Thread mainThread;
public DreamStatsTracker(){
mainThread = new Thread(() -> {
while(true){
for (SkillAndValue skillAndValue : Skills) {
try {
SetValueForSkill(this.SessionId, skillAndValue.getSkill(), skillAndValue.getValue());
System.out.println("Added value: " + skillAndValue.getValue());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(2000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
public void AddSkillAndValue(Skill Skill, Callable<Integer> function) throws Exception{
Skills.add(new SkillAndValue(Skill, function));
}
public void Start(){
for (SkillAndValue skillAndValue : Skills) {
AddSkill(this.SessionId, skillAndValue.getSkill(), this.Username);
}
this.mainThread.start();
}
这是主要课程:
public static void main(String[] args) throws Exception {
DreamStatsTracker tracker = new DreamStatsTracker();
tracker.StartNewSession("ae-13s-90-11", "Abe");
tracker.AddSkillAndValue(Skill.HERBLORE, getRandomNumber());
tracker.Start();
}
private static Callable<Integer> getRandomNumber(){
return new Callable<Integer>(){
public Integer call(){
Random random = new Random();
return random.nextInt(10000);
}
};
}