2016-07-16 148 views
0

我正在嘗試爲我的用戶編寫一個庫,並希望它儘可能易於使用。現在,要使用它,你必須開始一個新的線程,並在你的主類中設置很多變量來跟蹤,但是我的用戶並不總是有Java的經驗,而且線程對於我的一些用戶來說可能太難了。在主類中啓動一個新線程的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

所以..你想打動了'新Thread'初始化成DreamStatsTracker方法調用'Start()'? –

+0

沿着這些線是的東西。它會在Start方法中包含一個foreach循環,爲每個添加的技巧運行以下代碼: tracker.AddSkill(response.getSessionId(),SkillName,「Username」); 然後連續跟蹤發送給線程中的那些技能的數據 – Jannik

+1

那麼,這有什麼問題?只需移動該線程創建並開始使用'tracker.start()'方法即可。 – Nikem

回答

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