2017-03-31 3 views
3

私はMMOブラウザゲーム用のサーバーを作成していますが、スレッドをいくつか作成する必要があります。 彼らはいつも睡眠時間をつけて走っています。 このようなスプリングスレッドを使用することをお勧めしますか? Beanとして実装され、タスクエグゼキュータとWebアプリの春のスレッド

@Component 
@Scope("prototype") 
public class PrintTask2 implements Runnable{ 

String name; 

public void setName(String name){ 
    this.name = name; 
} 

@Override 
public void run() { 

    System.out.println(name + " is running"); 

    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    System.out.println(name + " is running"); 

} 

}

<bean id="taskExecutor" 
     class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="WaitForTasksToCompleteOnShutdown" value="true" /> 
</bean> 

また、スレッドはビーンとして定義されたシングルトンでも開始されます。

私のアプローチでは間違いがありますか?

+0

問題を解決しましたか?より多くの助けが必要かどうか尋ねるだけです。 – kkflf

答えて

2

@Scheduled(fixedDelay = 5000)を使用すると、メソッドを定期的に実行できます。メインメソッドを含むクラスには@EnableSchedulingを設定することを忘れないでください。

@Scheduledアノテーションには、fixedDelayfixedRateという2つのオプションがあります。

fixedDelayは、最後の実行が完了してからXミリ秒の遅延でメソッドを継続的に実行します。

fixedRateは、固定日付でメソッドを継続的に実行します。したがって、最後の実行が終了したかどうかに関係なく、このメソッドはXミリ秒ごとに実行されます。

複数のオブジェクトを一度に処理する場合は、@Asyncを使用することもできます。もう一度、メインメソッドでクラスに@EnableAsyncを追加する必要があります。

//Remember to set @EnableScheduling 
//in the class containing your main method 
@SpringBootApplication 
@EnableScheduling 
@EnableAsync 
public class Application { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class); 
    } 
} 

@Component 
public class ScheduledTasks { 

List<YourObject> myObjects; 

    //This method will run every 5 second. 
    @Scheduled(fixedDelay = 5000) 
    public void yourMethodName() { 
     //This will process all of your objects all at once using treads 
     for(YourObject yo : myObjects){ 
      yo.process(); 
     } 
    } 
} 

public class YourObject { 

    Integer someTest = 0; 

    @Async 
    public void process() { 
     someTest++; 
    } 
} 

あなたはAsyncConfigurerSupportを拡張し、getAsyncExecutorをオーバーライドすることにより、プールのサイズのためのあなたのXML構成を取り除くことができます ボーナス。呼び出したいあなたは場合に@Asyncを使用することができます

https://spring.io/guides/gs/scheduling-tasks/

https://spring.io/guides/gs/async-method/

+0

だから私は本当にスレッドを作成していないのですか?いいね。私はメインメソッド(私はSpringBootを使用していない)を持っていないときに、このスレッドを開始している@EnableAsyncアノテーションをシングルトンに追加する必要がありますか? – Parys

+0

さて、私はそれを見つけました。誰かが同じようなことを探しています場合:それは、<タスク:注釈駆動型>を置くことによって行うことができる[OK]をXML – Parys

0

:このアプローチについての詳しい情報は以下のリンクで見ることができ

私はあなたを見てみましょうことを示唆していますプログラムで1つのスレッドをプログラム的に(例えば50メールを送信し、50種類のスレッドを作成してそれぞれに1つのメッセージを送信してから、すべてのスレッドが終了するまで待ちます)、または@Scheduledを使用して固定レートでメソッド/ (または前の実行終了からしばらくしてから)。

詳細はhttps://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-annotation-supportをご覧ください。

@Service 
public class MyAsyncStuff { 
    @Async 
    public Future<String> callMe(String param) { 
     // do your work here...   
     return new AsyncResult<String>("Sent: "+param);   
    } 
} 

@Service 
public class MyWorker { 
    @Inject 
    MyAsyncStuff stuff; 

    public void invoker() { 
     List<Future<String>> futures = new Arraylist<>(); 
     for (int i=0; i<10; i++) { 
      futures.add(stuff.callMe("Invoked "+i)); 
     } 
     for (Future<String> fut : futures) { 
      try { 
       System.out.println(futures.get(); 
      } catch (Exception e) { 
      // Spock? Do something! 
      } 
     } 
    } 
} 
+0

で、私は単一のスレッドがすべての作業を行うと、別のものを開始しないで欲しいので、もし、私が@Scheduledを使用する必要がありますか?シングルトンで始めるのはどうですか? – Parys

+0

これは達成したいことによって異なります。一度にすべてのオブジェクトを処理したい場合は、@Asyncを使用する必要があります。しかし、特定のタスクを定期的に実行する場合は、 '@ scheduled'を使用します。 2つのアノテーションを組み合わせて、オブジェクトのコレクションを一度に処理するタスクを定期的に実行することもできます。 – kkflf

+0

(at)Scheduledはタスクを繰り返し実行するために使用されます。あなたが何らかの時間間隔で何かをチェックしたいならば。あなたが望むときに停止したり、始めることはできません。あなたはそれが実行をブロックしないようにするために、バックグラウンドで何かを作るようにするスレッドを開始したい場合(例えば、その後のzipファイルを準備する際に、完全なメール経由で送信)(で)非同期は何が必要です。おそらくPrintTaskはこの2番目のケースに該当します。 – Sampisa

関連する問題