Смотани Java грешки #3 [updated x1]

Java-coffe-128И сега уште еден бисер:

1) Користење Thread(runnable) кај GUI апликации наместо java.awt.EventQueue.invokeLater(runnable)

Кога правиме GUI апликација, некогаш сакаме да креираме нова нишка, за да не ја кочи апликацијата. Пример, ако кога ќе кликнеме копче, и во него се извршува некој циклус кој трае многу долго време.  Или пример долга пресметка. Или пример целта на копчето ние цело време додека работи програмата некоја периодична работа да ја прави. Во сите овие примери, додека не заврши кодот во копчето, односно не си ја заврши работата, нашата апликација ќе изгледа како ‘укочена’.

Еден начин да го решиме ова е да го направиме следново:
Thread thread = new Thread(new Runnable () {

public void run() {
// тука оди нашиот код
throw new UnsupportedOperationException("Not supported yet.");
}

});
thread.start();

Но, секогаш подобро е тоа да се изврши на следниот начин:
java.awt.EventQueue.invokeLater(new Runnable () {

public void run() {
// тука оди нашиот код
throw new UnsupportedOperationException("Not supported yet.");
}

});
Зошто? Бидејќи вака знаете дека сигурно ќе се изврши вашиот код. Во горниот пример, може нишката да ‘падне’ односно да не се изврши. Во вториот пример, кога сите настани кои се извршуваат завршиле, ќе се изврши и нашиот код. Тоа е затоа што кога се креира оваа нишка, се вметнува во редот за чекање, и сигурно се извршува. А првата пробува насилно веднаш да се изврши.

UPDATE: После коментарите на колегата, го додадов примерот и за Swing (горниот е за AWT), но ист стил на решение е (бидејќи на некој начин Swing е надоградба врз AWT):
SwingUtilities.invokeLater(new Runnable() {

public void run()
{
// нашиот код
throw new UnsupportedOperationException("Not supported yet.");
}
});

2 thoughts on “Смотани Java грешки #3 [updated x1]

  1. Како студент на ИИ – КАМ, подобро би било да дадеш некој пример од JAVA RMI, TCP/IP, UDP, Нишки да, али не да ја наведуваш нивната употреба во java.awt, денес многу повеќе се користи Swing Application Framework

    1. Ова е real world example што ми се случил мене (бидејќи портирав апликација) :D – во мој случај беше java.awt.EventQueue.invokeLater, а во Swing би било:
      SwingUtilities.invokeLater( new Runnable() {
      public void run()
      {
      // нашиот код
      }
      } );
      – што е ептен слично нели.
      А околу Swing vs AWT: “Much of the Swing API is generally a complementary extension of the AWT rather than a direct replacement.” Иако да, Swing се користи најмногу од сите Java Widget тулкитовите, иако SWT апликациите поубаво изгледаат на сите платформи отколку Swing апликациите.

      П.С. Фала за предлогот, ќе напишам некој пример секако, одамна немам напишано “Смотани Java грешки #” статија :)

Напишете коментар

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Промени )

Twitter слика

You are commenting using your Twitter account. Log Out / Промени )

Facebook photo

You are commenting using your Facebook account. Log Out / Промени )

Google+ photo

You are commenting using your Google+ account. Log Out / Промени )

Connecting to %s