マルチスレッド | 江木町の牛舎

江木町の牛舎

~ 田舎者プログラマの日常 ~

先日の続き

マルチスレッドのバグ修正方法を調査していて少しずつ分かって来ました。
わかっている人にはスルーしてください。
勉強中なので はぁ? という箇所があるかも(^_^;)

とりあえず、メインスレッドで動かさなきゃエラーになるよ、ってことは理解

散々VB.NETで面倒な処理をやってきたので
まぁ、途中で面倒になっておまじないをかけましたけど

で、画面更新処理を一箇所にまとめれば
表示データの作成処理は裏で別スレって単純にできるんですが
既存処理がデータ作成して画面更新してってやっているので
画面更新部分を小出しにしなきゃいけなくてさてどうしたものかと

何も考えずに修正したら山のように匿名クラスが出来たのでw

で、ゴニョゴニョと調べてみて、動かしてみたのが下記のソース

Swing使ってないから本当はいらないんだけどw
まぁ、お試しということで

Invoke用のRunnableクラスは汎用的に作成できるのね 便利♪
もっと良い方法があると思うけど現状はこれで行こうかなぁ、と思ってます

実際の搭載結果は機会があればまた

問題は 1.4 でこれ使えるの?(^_^;)
やっぱ1.5以降かなぁ...

尚、NetBeansで試したので勝手に挿入箇所が多々あります
適当に流してください(^_^;)


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;

/**
 *
 * @author perfume
 */
public class JavaApplication1 {
    private static class MyRunner implements Runnable{
        Object o=null;
        String m=null;
        Object[] args=null;
        public void run(){
            Class[] c=new Class[args.length];
            for(int i=0;i<c.length;i++){
                c[i]=args[i].getClass();
            }
            try {
                o.getClass().getMethod(m, c).invoke(o, args);
            } catch (Exception ex) {
                Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        public MyRunner runner(Object o,String m,Object... args){
            this.o=o;
            this.m=m;
            this.args=args;
            return this;
        }
    }
    private static MyRunner runner=new MyRunner();
    private static StringBuffer s=new StringBuffer();
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Thread t=new Thread(new Runnable(){
            public void run(){
                MyThread("hogehoge");
            }
        });
        
        Thread t2=new Thread(new Runnable(){
           public void run(){
               MyThread("hohohohoho");
           } 
        });
        t.run();
        t2.run();
                
    }

    private static void MyThread(String a_s){
        try {
            SwingUtilities.invokeAndWait(runner.runner(s, "append",a_s));
        } catch (InterruptedException ex) {
            Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println(s.toString());
    }
}