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 );
	}
}