在主类中启动新线程的Java类

时间:2016-07-16 07:45:14

标签: java multithreading

我正在尝试为我的用户编写一个库,并希望它尽可能地易于使用。现在,要使用它,你必须开始一个新的线程,并设置很多变量来跟踪,在你的主类中,但是我的用户并不总是有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的新实例,它将启动一个新线程,并在主类运行时在后台持续跟踪添加技能的值。

我该如何处理,甚至可能?

1 个答案:

答案 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);
        }
    };
}