• 締切済み

invokeLaterの逆に

私は、SwingUtilities.invokeLater(Runnnable doRun)では、イベントディスパッチ・スレッド以外からの描画を伴うリクエストを、AWT-EventDispatchThreadの実行と同期して実行させるための機構だと理解しています。これは描画を伴う処理を描画のタイミングに集約して効率化する機能です。 では、逆にイベントディスパッチ・スレッドの過程で実行していながらも、描画の変化と直接関係ない処理を、イベントディスパッチ・スレッドの描画サイクルの終了後に後回しで行う方法はないのでしょうか?

  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

  • t-tommy
  • ベストアンサー率14% (8/54)
回答No.1

まず。 なぜ、”同期”に洗脳させれれたん?

関連するQ&A

  • SwingとEDT(イベントディスパッチスレッド)

    多くのサイトを見て、色々考えているのですが、イマイチ理解が及びません。以下のような風に思っていていいのでしょうか。 ・Swingではメインとなるmainスレッド(表現は正しくないかもしれない)と、描画関係のイベントを実行するイベントディスパッチスレッドで出来てる。 ・描画関係のイベント(正確にはコンポーネントの可視化及び可視化したコンポーネントの描画)はイベントディスパッチスレッド上で実行しなければならない。 ・SwingUtilities.invokeLaterを使うことによってその中身のプログラムをイベントディスパッチスレッドで実行してくれる...? →setVisible(true)やsetText("")など全てSwingUtilities.invokeLaterを使って記述しなければならない.....???(面倒すぎじゃないでしょうか) ・Swingでのマルチスレッドを行うにはSwingWorkerを使う(ことは見つけているのですが、まずEDTについて理解しないと先に進めないと思い、まだあまりこれの内容は調べていません) ・描画系の命令を実行しないのならば、別スレッドを作成して使用しても良い....? こんなところでしょうか。 しかし、このとおりだとすると今までの自分の書いてきたプログラムは間違いだらけ(特に「全ての描画系命令をSwingUtilities.invokeLaterを使いEDTで実行する」点)になってしまいます。 ちゃんとした理解をしておきたいので、わかりやすい説明でも、上記の間違っている点でもご教示願います。

  • SwingWorkerに関して

    このサイトにあるSwingWorkerについて、 このSwingWorkerクラスは、GUIを相対的に描画するためのスレッドという ことなのでしょうか?そうだとしたら、イベントディスパッチ用のスレッド と動作がダブりませんか? 以下のサイトでは説明が詳しくなくプログラムを見ただけでは、以上のよう に考えてしまうのですが、上記のようなプログラムと考えていいのでしょうか? http://terai.xrea.jp/Swing/SwingWorker.html

    • ベストアンサー
    • Java
  • javaプログラムのエラーについてです

    プログラムは無事コンパイルすることができました。 しかし、アプレットを実行すると以下のようなエラーが発生します。 なぜこのようなエラーが起こるのでしょうか?勉強不足ですいません。 Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 2 at sample1.paint(sample1.java:19) at java.awt.Container.update(Container.java:1988) at sun.awt.RepaintArea.updateComponent(RepaintArea.java:255) at sun.awt.RepaintArea.paint(RepaintArea.java:232) at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:347) at java.awt.Component.dispatchEventImpl(Component.java:4948) at java.awt.Container.dispatchEventImpl(Container.java:2287) at java.awt.Component.dispatchEvent(Component.java:4698) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:694) at java.awt.EventQueue$3.run(EventQueue.java:692) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo main.java:76) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo main.java:87) at java.awt.EventQueue$4.run(EventQueue.java:708) at java.awt.EventQueue$4.run(EventQueue.java:706) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo main.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:705) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre ad.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread. java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre ad.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

  • リスナについて

    Java を勉強している者です GUIライブラリである awt,swing のリスナについての質問です awt,swing では リスナというイベント処理用のクラスと処理内容を用意して その部品に、イベント用のリスナを登録することによって、コールバックする仕組みになっていると思います。 リスナとイベントの対応ですが、マウスリスナやキーリスナ、ボタンを押したときに対応するアクションリスナ などがありますが、多用する再描画に関しての paintListener がありません 再描画に対応する場合、常に部品を継承して、paintcomponent をオーバーライドして記述しなければなりません 再描画も重要なイベントだと思うのですがなぜリスナが用意されてないのか。 JFrame j = new JFrame(); j.addPaintListener( new PaintAdapter { void onPaint() { ... } } のように描画処理を後付できないかという質問です。 できるようならサンプルのコードを教えてください。 またpaintリスナが用意されない理由があればこれも教えていただけると幸いです。

    • ベストアンサー
    • Java
  • 非同期プログラミングは必ずマルチスレッド?

    非同期プログラミングは必ずマルチスレッドプログラミングになりますか? ここでいう非同期プログラミングとは、 何かのメソッドを実行してその処理(処理Aとする)の結果を待たずに次の処理Bを実行できて、処理Aが終わったらコールバックやデリゲートで、あらかじめ決められたメソッド(finishとする)が呼ばれるといったものです。 処理Aを実行するメソッドを呼ぶ ↓ すぐに処理Bを実行開始(このときバックグラウンドで処理Aが走っている) ↓ 処理Aが終了したのでfinishメソッドが実行される 例えば、Objective-CのNSURLConnectionで非同期通信するときのようなやつです。 こういった非同期プログラミングは、必ずマルチスレッドを使うことになりますか? 普通、別スレッドで処理させるときはスレッド用のライブラリを使うなどして明示的にマルチスレッドプログラミングをしますが、上のように非同期のメソッドを使うと、その裏で自動的に別のスレッドが動くのでしょうか。 それとも、単一スレッドのみで、非同期プログラミングできるでしょうか。 なお、特殊な言語やOSによっては、いくらでも可能性があると思いますので、 メジャーな環境(Windowsや、スマホ) のみに限定してお願いします。言語で言うと、C、C++、Objective-C、Javaあたり。 また、上の「処理A」が終わったとき、メソッド「finish」が呼ばれるとすると、 処理Bの実行中にどのようなタイミングでfinishが呼ばれるのでしょうか。 処理Bはどのような形でfinishに切り替わるのでしょうか。いきなりfinishに処理を奪い取られるのでしょうか

  • VB.NET開発(イベントプロシージャはマルチスレッドですか?)

    VB.NET開発(イベントプロシージャはマルチスレッドですか?) 以前より.NETのWindowsフォームの業務アプリ開発してますが、基本的な質問をさせて下さい。 イベントプロシージャの実行処理は、本体スレッド(実行時のスレッド)とは別のスレッドで動作しているのでしょうか。 例えば、ボタンのクリックイベントに何かしらの重い処理があったとします。このクリックイベントの処理ではボタンの制御をしていないので、イベントプロシージャの実行中は、処理中のボタンが押下可能な前提とします。この時、このボタンを3回押下して実行させると3つのスレッドが新規に作成されて実行していると考えて宜しいのでしょうか。 デリゲートやイベントに関するキーワードで検索して、いくつか資料を見たのですが、上記の疑問にぴったり合う解答がなく、質問させて頂きました。 業務アプリの開発で、今まで、あまりマルチスレッドなど意識せずやってきましたが、実は意識しなくても、マルチスレッドの開発をしていたことになるのでしょうか。 以前、VB6の開発もしておりました。 ちなみにVB6の場合も、イベントプロシージャはマルチスレッドで実行されていると考えて宜しいのでしょうか。 よろしくお願いします

  • SwingでSwingUtilities.invokeLater()の利用

    はじめまして。Javaビギナーです。 今Swingを利用したチャットアプリを作成しようと色々調べているところなのですが、よくmain()メソッド内にて public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { // 初期処理 } }); } というのを見かけます。 これは、Swingでアプリを実行する場合に上記のように作成することが一般的なのでしょうか? それとも、マルチスレッドを利用する必要のない場合などは上記のようなコーディングは行われないのでしょうか? 後々の機能拡張などを考えれば、上記のようにコーディングした方が良いのだと思いますが、一般的な利用方法を教えていただければと思います。宜しくお願いします。

  • Javaのマルチスレッド処理(スレッド数の上限)

    Tomcatを使用したWebアプリを作成しているのですがある処理を マルチスレッドで行う予定でいます。 画面でチェックボックスが100個チェックされたら100個スレッドを作成して それぞれのスレッドが通信を行うイメージです。 ここで以下の疑問があります。 1.一度に作成できるスレッドの数はTomcatがインストールされているOSに依存するのでしょうか。 2.もし100個が上限として101個スレッドを作成した場合、どうなるのでしょうか。 3.100個が上限とした場合、この数は一定でしょうか。何か別の全く関係のない重い処理が   実行されていてCPUに負荷がかかっていたりすると上限が10個になるということはあるので   しょうか。 4.一度に作成できるスレッドが100個とした場合、Tomcatが下記4人のリクエストを同時に処理   したらエラーという認識でよいでしょうか。それとも4人それぞれが100個ずつ(計400個)   スレッドを作成できるということでしょうか。   Aさん・・・30個のチェックボックスをONにして実行   Bさん・・・30個のチェックボックスをONにして実行    Cさん・・・30個のチェックボックスをONにして実行   Dさん・・・30個のチェックボックスをONにして実行 5.また、Javaプログラムで現時点で作成可能なスレッド数を取得することは可能でしょうか。

  • 画面の大きさに合わせてボールを動かせたい

    今日は。 javaの初心者です、宜しくお願いします。 下のようなボールが動くアプレットを組んでみましたが、画面の大きさを変えても ボールの動く範囲はかわりません。 画面の大きさに合わせて、動く範囲を自動的に変えてやるには、このプログラムの 何処をどのように書き換えてやるといいのでしょうか。  宜しくお願いします。 ========================================================================== import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; public class BallMove_1p extends Applet implements Runnable { private int width , height ; private Thread thread ; private boolean LoopEnd = false ; private int x1 = 30 , y1 = 100 ; private Image offScreen ; private Graphics screen ; private int vx = 2 , vy = 2 ; // アプレット初期化処理 public void init() { // アプレット画面サイズ取得 width = getSize().width ; height = getSize().height ; // スレッド起動 thread = new Thread( this); thread.start(); // オフスクリーンの初期化 offScreen = createImage( width, height); // オフスクリーンを作成 screen = offScreen.getGraphics(); // オブジェクトを取得 } // スレッドループ処理 public void run() { while(LoopEnd == false) { move() ; repaint() ; try { Thread.sleep( 10 ) ; } catch ( InterruptedException e ) {} } } // ボール移動 private void move() { if( x1 >= width - 50 ) { vx =- vx ; } if( y1 >= height - 50 ) { vy =-vy ; } if( x1 < 0 ) { vx =- vx ; } if( y1 < 0 ) { vy =-vy ; } x1 += vx; y1 += vy; } // 再描画時処理 public void update( Graphics g) { paint(g) ; } // 描画処理 public void paint( Graphics g) { screen.clearRect( 0 , 0 , width , height ) ; // 画面消去 screen.setColor( Color.blue ) ; screen.fillOval( x1 , y1 , 50 , 50 ) ; g.drawImage( offScreen , 0 , 0 , this ) ; // イメージを描画 } // アプレット終了時処理 public void destroy() { LoopEnd = true ; } }

    • ベストアンサー
    • Java
  • Eclipse以外でアプレットが実行出来無い

    おはよう御座います、非常に初歩的な内容だと思うのですが、アプレットについて質問させて頂きます。 現在、Eclipseで作成したアプレットを、ブラウザ上で実行しようとしています。 ですが、Eclipseでアプレットを起動中に自動生成されるhtmlファイルをコピーしたhtmlファイルでも、アプレットを起動することが出来ないのです。 htmlファイルとclassファイルの内容さえ同じであれば、起動出来るのではと思っていたのですが・・・、何処がEclipseとChromeで違い、どう直せば良いのか解らず、質問させて頂きました。 HTMLファイルの内容は <html> <body> <applet code=Practice_1/HelloWorld.class width="200" height="200" > </applet> </body> </html> エラーの内容は以下の通りです。 Java Plug-in 1.6.0_31 使用中の JRE のバージョン 1.6.0_31-b05 Java HotSpot(TM) Client VM ユーザのホームディレクトリ = C:\Users\名前 java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/jbox2d/callbacks/ContactListener at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source) at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NoClassDefFoundError: org/jbox2d/callbacks/ContactListener at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) at java.lang.Class.getConstructor0(Unknown Source) at java.lang.Class.newInstance0(Unknown Source) at java.lang.Class.newInstance(Unknown Source) at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$000(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: org.jbox2d.callbacks.ContactListener at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 20 more 例外: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/jbox2d/callbacks/ContactListener 実行しようとしているプログラムでは、Eclipseで言う所のプロジェクト内に、ImageとPractice_1というパッケージがあり、動作させたいクラスはPractice_1内に入っています、Eclipseでは当然何のエラーも無く実行出来ます。 見た限り、ContactListenerクラスが見つからない、というエラーのようなのですが、それ以外の後から入れたライブラリのクラスに関してはエラーが表示されていないので困惑しています。 Eclipseで自動生成された内容から一切変えていないので、htmlファイルが間違っているわけでは無いと思っていたのですが、ブラウザ上で起動する場合は何か付け加える物があるのでしょうか・・・、どなたか解る方が居ましたら、解答頂けると助かります。

    • ベストアンサー
    • Java

専門家に質問してみよう