Java je zcela jistě nejlepší programovací jazyk na
světě, ale bohuzel ne všude má dobré jméno.

Možná jedním z důvodů mohou být špatné kódy, které
se podařilo projekt managerům "vyrazit" z
programátorů, kteří Javu pořádně neumí a nebo jim na
to nedali dost času.

Zde uvádím ukázku kódu, která ukazuje, jak je Java
skvělý programovací jazyk.

Příklad mimojiné spustí dvě vlákna. Vlákno P1 požaduje od vlákna P2 výsledek. Pakliže je výsledek k dispozici tak se
ukončí a výsledek vypíše. Pokud výsledek není, čeká
na něj s použitím metody wait.

Pokud v příkladu dojde libovolné modifikaci času u
metody s jako sleep, nikdy nedojde
k tomu, že se vlákno P1 zablokuje.  To se teoreticky může stát  tak, že
P1 provede wait a již se nedočká metody notify.

V tomto příkladě tato situace nenastane, ikdyž
budeme sleepovat na libovolném místě..

 

public class Test {

	Integer state = 0;
	Object mon = new Object();

	boolean stop = false;

	void process1() {

		new Thread() {

			public void run() {

				s( "P1", 2000 );
				p( "P1", "Request for P2 stop!" );

				stop = true;
				s( "P1", 100 );

				synchronized ( mon ) {
					if ( state == -1 ) {

						p( "P1", "P2 is already stop." );
					} else {

						s( "P1", 1 );
						p( "P1", "Wait for P2 stop." );

						w( "P1", mon );
						p( "P1", "Thread is weak up." );

					}
				}
				p( "P1", "done: " + state + " OKAY" );

			}
		}.start();
	}

	void process2() throws InterruptedException {

		final int stopTimeSeconds = 5;
		new Thread() {

			public void run() {
				s( "P2", 2000 );
				long start = System.currentTimeMillis();
				while ( true ) {
					s( "P2", 500 );
					p( "P2", "Flag stop=" + stop );
					if ( stop == true ) {
						synchronized ( mon ) {
							s( "P2", 100 );
							p( "P2", "Notify P1." );
							mon.notify();
							s( "P2", 100 );
							state = -1;
						}
						p( "P2", "End." );
						break;
					}
					if ( System.currentTimeMillis() - start > 5 * stopTimeSeconds ) {
						state = -1;
						p( "P2", "Regular end after " + stopTimeSeconds + " seconds." );
						break;
					}
				}
			}
		}.start();
	}
	public static void main( String[] args ) throws Throwable {
		Test y = new Test();
		p( "XX", "start P1" );
		y.process1();
		p( "XX", "start P2" );
		y.process2();
		leaveAppRunFor( "XX", 10 );
	}
	static void leaveAppRunFor( final String p, final int seconds ) {
		new Thread() {
			public void run() {
				while ( true ) {
					s( p, seconds * 1000 );
					p( p, "Application is stop after 10 seconds." );
					s( p, 100 );
					System.exit( 0 );
				}
			}
		}.start();
	}
	static void s( String p, long millis ) {
		try {
			p( p, "\tSleep for " + millis + " millis." );
			Thread.sleep( millis );
		} catch ( InterruptedException e ) {
			e.printStackTrace();
		}
	}
	static void w( String p, Object obj ) {
		try {
			p( p, "\tWait." );
			obj.wait();
		} catch ( InterruptedException e ) {
			e.printStackTrace();
		}
	}
	static void w( String p, Object obj, long millis ) {
		try {
			p( p, "\tWait for " + millis + " millis." );
			obj.wait( millis );
		} catch ( InterruptedException e ) {
			e.printStackTrace();
		}
	}
	static void p( String p, String string ) {
		System.out.println( p + "# > " + string );
	}
}