質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Seasar2

Seasar2はJ2EE/Java EEでの大規模な開発を効率良く行なうためのフレームワークです。 必要な設定ファイルを従来のものと比べて少なくし、依存性を分離して記述しています。 そのため、生産性の高いプログラム開発が可能です。

Q&A

解決済

2回答

1996閲覧

s2chronosにおけるスレッド制御について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Seasar2

Seasar2はJ2EE/Java EEでの大規模な開発を効率良く行なうためのフレームワークです。 必要な設定ファイルを従来のものと比べて少なくし、依存性を分離して記述しています。 そのため、生産性の高いプログラム開発が可能です。

0グッド

0クリップ

投稿2017/01/11 13:31

s2chronosですが、以下のようにプログラム例にならって書いても、
CloneTaskアノテーションで指定した数だけスレッドが走ってしまいます。
全くThreadPoolSizeに指定した数が効いてないようです。

今回約100万件のデータを処理するために初めてマルチスレッドに手を出しました。

さらに、例のようにgetThreadPool()メソッドを記述すると
タスクがスケジューラに登録されない状態になります。
(コメントアウトして実行しています)

java

1@Task 2@NonDelayTrigger 3public class BasicTask { 4 5 private static Logger log = Logger.getLogger(BasicTask.class); 6 7 private TaskThreadPool threadPool = new ThreadPool(); 8 9 public void initialize(){ 10 threadPool.setThreadPoolType(ThreadPoolType.FIXED); 11 threadPool.setThreadPoolSize(2); 12 } 13 14 // スレッドプールを返します. 15 public TaskThreadPool getThreadPool(){ 16 return threadPool; 17 } 18 19 // タスク処理 20 @CloneTask(20) 21 public void doExecute() { 22 log.info(this.getClass().getSimpleName() + ":doExecute"); 23 } 24 25}

古いプロダクトなので現在の環境
・JDK 1.7.40
・Tomcat 6
に対応していない可能性もあります。
そもそもドキュメントや使用例が少ないため、調べても出てこない状況です。

CloneTaskアノテーションを使わないシングルスレッドタスクなら問題ないのですが...。

知見をお持ちの方ご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

s2chronosのタスク内でスレッドプールを使ってマルチスレッドを実装しました。

java

1List<Future<Long>> list = new ArrayList<Future<Long>>(); 2for (int i = 0; i < 10; i++) { 3 Future<Long> future = exec.submit(new TestCallable()); 4 list.add(future); 5} 6 7//Future#getメソッドで結果を取得できる。実行中の場合は終了まで待つ。 8 9for (Future<Long> future : list) { 10 try { 11 Long id = future.get(); 12 } catch (InterruptedException e) { 13 e.printStackTrace(); 14 } catch (ExecutionException e) { 15 e.printStackTrace(); 16 } 17}

投稿2017/01/12 11:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

マルチスレッドをスレッドプールで動かすだけだと以下でできます
今回の目的に合致したものかどうかは分かりませんが・・・

java

1import java.util.concurrent.*; 2 3public class OLP { 4 5 private ExecutorService service = null; 6 7 public static void main(String[] args) { 8 OLP a = new OLP(); 9 10 a.initialize(); 11 a.doExecute(); 12 } 13 14 public void initialize() { 15 service = Executors.newFixedThreadPool(3);//スレッド3つ 16 } 17 18 public ExecutorService getThreadPool() { 19 return service; 20 } 21 22 void doExecute() { 23 24 try { 25 Runnable task = () -> { 26 String name = Thread.currentThread().getName(); 27 System.out.println(name + "--" 28 + this.getClass().getSimpleName() + ":doExecute"); 29 30 31 }; 32 for (int i = 0; i < 20; i++) { 33 service.execute(task); 34 } 35 } finally { 36 if (service != null) 37 service.shutdown(); 38 } 39 } 40}

投稿2017/01/11 14:50

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/01/12 11:31

JDK1.7と明示しているのにラムダ式を使用したコードを提示しないでください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問