2016-07-16 5 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); 
     } 
    }; 
} 
関連する問題