我正在尝试为我的用户编写一个库,并希望它尽可能易于使用。现在,要使用它,你必须启动一个新的线程,并在你的主类中设置很多要跟踪的变量,然而我的用户并不总是对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的一个新实例,该实例将启动一个新线程,并在主类运行时在后台持续跟踪添加的技能的值。
我该如何处理这件事,这是可能的吗?
发布于 2016-07-16 22:54:58
经过几个小时的测试和尝试,我终于解决了我的问题。
这是我所做的:
追踪器类:
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);
}
};
}https://stackoverflow.com/questions/38409012
复制相似问题