---
category: swing
folder: SecondaryLoop
title: SecondaryLoopを使用してイベント・ディスパッチ・スレッド上で別途イベント・ループを実行する
tags: [SecondaryLoop, InputEvent, JLayer]
author: aterai
pubdate: 2015-10-12T05:29:04+09:00
description: SecondaryLoopを使用して、イベント・ディスパッチ・スレッドをブロックせずに、別スレッドをイベント・ループを実行します。
image: https://lh3.googleusercontent.com/-eAqnf0aNSsQ/VhrDDmUQQeI/AAAAAAAAODs/fwDgjYwjTbk/s800-Ic42/SecondaryLoop.png
---
* 概要 [#summary]
`SecondaryLoop`を使用して、イベント・ディスパッチ・スレッドをブロックせずに、別スレッドをイベント・ループを実行します。

#download(https://lh3.googleusercontent.com/-eAqnf0aNSsQ/VhrDDmUQQeI/AAAAAAAAODs/fwDgjYwjTbk/s800-Ic42/SecondaryLoop.png)

* サンプルコード [#sourcecode]
#code(link){{
layerUI.setInputBlock(true);
SecondaryLoop loop = Toolkit.getDefaultToolkit()
                            .getSystemEventQueue().createSecondaryLoop();
Thread worker = new Thread() {
  @Override public void run() {
    doInBackground();
    layerUI.setInputBlock(false);
    loop.exit();
  }
};
worker.start();
loop.enter();
}}

* 解説 [#explanation]
上記のサンプルでは、[[JLayerで指定したコンポーネントへの入力を禁止>Swing/DisableInputLayer]]と同様の`JLayer`を使用して任意のコンポーネントへの入力可不可を切り替えていますが、`SwingWorker`を使用するのではなく`SecondaryLoop`を使用してバックグラウンドで処理を実行している間でもイベント・ディスパッチ・スレッドをブロックしないようにしています。
上記のサンプルでは、[[JLayerで指定したコンポーネントへの入力を禁止>Swing/DisableInputLayer]]と同様の`JLayer`を使用して任意のコンポーネントへの入力可不可を切り替えていますが、`SwingWorker`ではなく`SecondaryLoop`を使用してバックグラウンドで処理を実行している間はイベント・ディスパッチ・スレッドをブロックしないよう設定しています。

* 参考リンク [#reference]
- [http://sellmic.com/blog/2012/02/29/hidden-java-7-features-secondaryloop/ Hidden Java 7 Features – SecondaryLoop @ sellmic.com]
-- [https://stackoverflow.com/questions/10196809/secondaryloop-instead-of-swingworker java - SecondaryLoop instead of SwingWorker? - Stack Overflow]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/awt/SecondaryLoop.html SecondaryLoop (Java Platform SE 8)]
- [[JLayerで指定したコンポーネントへの入力を禁止>Swing/DisableInputLayer]]

* コメント [#comment]
#comment
#comment