SSISO Community

시소당

SwingUtilities.invokeLater

>public  class  A  extends  JFrame
>{
>          public  void  connect()
>          {
>                      final  JDialog  dialog  =  new  JDialog();
>                      SwingUtilities.invokeLater
                      (
                                new  Runnable()
                                {
                                          public  void  run()
                                          {
                                                    System.out.println(  "dialog  show"  );
                                          }
                                  }
                      );
                      System.out.println(  "dialog  dispose"  );

>            }

>}

>  

>이렇게  있을때

>  

>new  A().connect();  하면

>  

>"dialog  show"

>"dialog  dispose"

>  

>그런데

>  

>class  A에  JButton하나를  만들어서  붙여넣고

>버튼이  클릭되었을때  connect()함수가  호출되도록

>바꾼다음

>  

>버튼을  클릭하면

>  

>"dialog  dispose"
"dialog  show"

>  

>이렇게  거꾸로  출력됩니다.

>  

>여러가지로  테스트  해보는데  아직  이유를  모르겠습니다.

>  

  

이벤트  디스패치  쓰레드라는게  있습니다.

  

스윙에  관련된  작업이  모두  이  쓰레드를  통해서  이루어져야  하는데,  이  쓰레드가  바로  스윙  관련  작업들을  처리하는  역할을  합니다.  간단하게  말해서  스윙관련  이벤트들을  일렬로  줄세워서  여러개의  이벤트가  동시에  하나의  스윙  컴포넌트에  접근해서  데이터  조작을  하는  것을  막아줍니다.(여러개의  이벤트가  동시에  하나의  JButton의  데이터를  바꾼다면  문제가  생길  겁니다...)  꼭  한순간에  하나의  이벤들가  원하는  작업을  하게끔  해준다는  겁니다.  

하루에  하나씩  소원을  들어주는  바람돌이처럼  이벤트  디스패치  쓰레드는  한번에  한개의  이벤트가  실행되게  합니다.  

invokeLater  는  말  그대로  "나중에  호출해라"  라는  뜻인데,  나중에  호출할  대상이  바로  파라미터로  주어지는  Runnable  입니다.  

                                new  Runnable()
                                {
                                          public  void  run()
                                          {
                                                    System.out.println(  "dialog  show"  );
                                          }
                                  }

  

  

바로  이놈을  "나중에  호출한다"  는  것인데,  왜  나중에  호출할까요?
왜냐하면  지금  하고  있는  작업을  계속  진행하기  위해서입니다.
지금  계속  하고  있는  작업이란...  

>          public  void  connect()
>          {
>  
>                      final  JDialog  dialog  =  new  JDialog();
                      .....
                      .....

                      System.out.println(  "dialog  dispose"  );
>            }

>}

  

바로  이것입니다.  다이얼로그를  만들고  "dialog  dispose"  를  출력하는  것이죠.

invokeLater에  전달된  Runnable은  이벤트  디스패치  스레드의  큐(대기열)에  넣는  일을  할  뿐입니다.

코드에  적혀있다고  그게  먼저  실행되는  것은  아니라는  것입니다.

그러니까  현재  진행중인  작업과  디스패치  스레드에서  하는  작업이  분리되어서  진행되는  것입니다.


출처  :  http://cafe.naver.com/javacircle.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=9680

897 view

4.0 stars