/*
 * Zhikai Wang/www.heteroclinic.net (c) 2013
 * Sleep is better than not sleep.
 * TODO:
 * - It does not stop.
 * - convert bool array to number
 * - IO severely affects context switch, performance etc.
 */
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Calendar;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

class Shared {
	public static volatile boolean shared = false;
	public static volatile boolean halted = false;
}

class Task implements Runnable {

	public static AtomicLong count = new AtomicLong(0);
	protected long ID;

	public Task() {
		this.ID = count.incrementAndGet();
	}

	@Override
	public void run() {

		try {
			while (!Thread.interrupted() && !Shared.halted) {
				Shared.shared = !Shared.shared;
			}
		}
		// catch (InterruptedException e) {
		// }
		finally {
		}
	}
}

public class RaceConditionRandomSeeder {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int nooftasks = 4;
		List<Task> tasks = new ArrayList<Task>();

		List<Future<?>> fl = new ArrayList<Future<?>>();
		ExecutorService exec = Executors.newCachedThreadPool();

		for (int i = 0; i < nooftasks; i++) {
			tasks.add(new Task());
		}

		// printTasksStatus();
		for (Task t : tasks) {
			fl.add(exec.submit(t));
		}
		try {
			TimeUnit.NANOSECONDS.sleep(1000000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		int numberofbits = 20;
		boolean[] barr = new boolean[numberofbits];

		// BitSet bits1;

		for (int j = 0; j < 100; j++) {
			for (int i = 0; i < barr.length; i++) {
				barr[i] = Shared.shared;
				try {
					TimeUnit.NANOSECONDS.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
			for (int i = 0; i < barr.length; i++) {
				// barr[i] = Shared.shared;
				System.out.print(barr[i] + " ");
			}
			System.out.println();
		}

		Shared.halted = true;
		for (Future<?> f : fl) {
			f.cancel(true);
		}
		try {
			TimeUnit.NANOSECONDS.sleep(1000000000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
