tifyty

pure Java, what else ?

Tudásteszt, multi thread 2

A wouter.coekaerts.be web oldalról loptam a következő feladatot, de annyira megizzasztott, és annyira jó, hogy úgy gondoltam kiposztolom ide. Ha csak annyi a hozzáadott érték, hogy magyarul írom meg a magyarázatot, és eközben még egyszer átgondolom, akkor is megéri.

Bevallom őszintén: én magam nem oldottam meg a feladatot, türelmetlen voltam, mert mostani elfoglaltságaim mellett (dolgoznom is kell, sajnos mert a blogért nem fizettek) legalább hétvégéig kellett volna várnom, hogy legyen annyi időm, hogy elgondolkodhassak a megoldáson. De a feladat íme:

Van egy alvó osztályunk:

package sleep;
 
import dream.Dream;
 
public class Sleeper {
    private int level;
 
    public synchronized int enter(Dream dream) {
        level++;
        try {
            dream.dream(this);
        } finally {
            level--;
        }
        return level;
    }
}

És van egy másik, főosztályunk

package sleep;
 
import dream.Dream;
 
public class Main {
    public static void main(String[] args) {
        if (new Sleeper().enter(new Dream()) != 0) {
            // The goal is to reach this line
            System.out.println("Am I still dreaming?");
        }
    }
}

Ezen kívül pedig van egy megírandó álom osztályunk:

// this is the only file you're allowed to edit
package dream;
 
import sleep.Sleeper;
 
public class Dream {
    public void dream(Sleeper s) {
        // TODO implement me
    }
}

A feladat ezt az utolsó álomosztályt úgy megírni, hogy a főosztály kiírja a csodálkozó kérdést: Am I still dreaming?

Ha nagyon nem megy, akkor adok egy tippet, és ha az sem elég, akkor itt a megoldás.

4 responses to “Tudásteszt, multi thread 2

  1. Gábor Lipták március 20, 2013 10:42 de.
        public void dream(final Sleeper s) {
            final CountDownLatch daemonAtRightPlace = new CountDownLatch(1);
            final Dream trickyDream = new Dream() {
                public void dream(Sleeper s) {
                    daemonAtRightPlace.countDown();
                    synchronized (s) {
                        try {
                            s.notifyAll();
                            s.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
            };
            Thread daemonThread = new Thread() {
                public void run() {
                    s.enter(trickyDream);
                };
            };
            daemonThread.setDaemon(true);
            daemonThread.start();
            synchronized (s) {
                try {
                    s.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            try {
                daemonAtRightPlace.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
  2. Zoltán Baranyi (@blazember) március 20, 2013 12:43 du.
    public class Dream {
    
    	private volatile boolean nightmareHasStarted;
    
    	public void dream(final Sleeper s) {
    		try {
    			if (!nightmareHasStarted) {
    				nightmareHasStarted = true;
    				new Thread() {
    
    					@Override
    					public void run() {
    						s.enter(Dream.this);
    					}
    				}.start();
    
    				s.wait();
    				s.notify();
    			} else {
    				s.notify();
    				s.wait();
    			}
    		} catch (InterruptedException ex) {
    			ex.printStackTrace();
    		}
    	}
    }
    

    A synchronized Sleeper.enter() miatt a synchronized(s) blokkot bátorkodtam elhagyni a commentbéli olvashatóság kedvéért.

  3. H.Z. augusztus 22, 2013 8:04 de.

    Véletlenül tévedtem ide, de ennél a posztnál elakadtam. Tetszik, na… Igyekszem nem elolvasni a két, engem megelőző hozzászólást. Elsőre triviálisnak tűnt a feladat. Másodjára már nem annyira. Végül eljutott a tudatomig, hogy nem véletlen a “multi thread” a címben. 🙂
    Sajnos javaul nem nagyon értek, de ha sikerül megoldanom, akkor megpróbálom áttenni pythonra is. 🙂

  4. H.Z. augusztus 22, 2013 8:27 de.

    Sajnos a netbeans-t nem tudtam működőképessé varázsolni (régi telepítésű, milliószor átkonfigurált linux, ami PHP-re lett “kihegyezve”, most a netbeans nem hajlandó új projektet nyitni), így marad, hogy “hangosan gondolkodom”.
    Közben kicsit puskáztam (megnéztem a Péter által adott tippet), de ez is csak megerősíteni látszik azon elképzelésemet, hogy végeredményben egy bugot kell produkálni az elvárt eredményhez.
    No, megyek, megnézem a megoldást is, mert a tényleges kivitelezéshez kellene egy új IDE-t telepítenem, plusz az évekkel ezelőtt félretolt java könyveket újra előszedni és hát… lustaság fél egészség! 🙂
    Kíváncsi vagyok, mit találok a megoldásban.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: