ConcurrentDictionary in C#

class Program
{
    const int MAGIC_NUMBER = 250000;
    ConcurrentDictionary<Int32, Int32> c = new ConcurrentDictionary<Int32, Int32>();

    public Program()
    {
        Thread[] threads = new Thread[6];
        int i = 0;
        for (; i < 4; i++)
        {
            int temp = i + 1;
            threads[i] = new Thread(() => searchFunction(temp));
        }
        threads[i++] = new Thread(() =>
            {
                Random r = new Random();
                while (true)
                {
                    try
                    {
                        for (int j = 0; j < 10000; j++)
                        {
                            int num = r.Next();
                            c.TryAdd(num, num);
                        }
                        Thread.Sleep(10);
                    }
                    catch (ThreadInterruptedException)
                    {
                        return;
                    }
                }
            });
        threads[i++] = new Thread(() =>
        {
            Random r = new Random();
            while (true)
            {
                try
                {
                    c.TryAdd(MAGIC_NUMBER, MAGIC_NUMBER);
                    Console.WriteLine("-->Thread 6: Magic Number Inserted");
                    Thread.Sleep(5000);
                }
                catch (ThreadInterruptedException)
                {
                    return;
                }
            }
        });

        for (int j = 0; j < threads.Length; j++)
            threads[j].Start();

            Thread.Sleep(100000);


        for (int j = 0; j < threads.Length; j++)
            threads[j].Interrupt();
    }

    void searchFunction(int i)
    {
        int count = i;
        while (true)
        {
            try
            {
                Int32 outNum;
                bool b = c.TryRemove(MAGIC_NUMBER, out outNum);
                if (b == true)
                {
                    c.Clear();
                    Console.WriteLine("Thread " + count + ": Magic Number found. Object id: " + RuntimeHelpers.GetHashCode(outNum));
                }

                Thread.Sleep(10);
            }
            catch (ThreadInterruptedException)
            {
                return;
            }
        }
    }

    static void Main(string[] args)
    {
        new Program();
    }
}

ConcurrentHashMap in Java

import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;

public class Concurrenthashmap {
	static final int MAGIC_NUMBER = 250000;
	ConcurrentHashMap<Integer, Integer> c = new ConcurrentHashMap<Integer, Integer>();
	class searchClass implements Runnable
	{
		int id;
		public searchClass(int id) {
			this.id = id;
		}
		
		@Override
		public void run() {
			Integer i = new Integer(MAGIC_NUMBER);
			while(true)
			{
				try {
					Integer o = c.remove(i);
					if(o != null)
					{
						c.clear();
						System.out.println("Thread " + id + ": Magic Number found. Object id: " + System.identityHashCode(o));
					}
					
					Thread.sleep(10);
				} catch (InterruptedException e) {
					return;
				}
			}
		}
	}
	
	public Concurrenthashmap() {
		Thread [] threads = new Thread[6];
		int i = 0;
		for(; i < 4; i++)
			threads[i] = new Thread(new searchClass(i + 1));
		threads[i++] = new Thread(new Runnable() {
			@Override
			public void run() {
				Random r = new Random();
				while(true)
				{
					try {
						for(int i = 0; i < 10000; i++)
						{
							int num = r.nextInt();
							c.put(num, num);
						}
						Thread.sleep(10);
					} catch (InterruptedException e) {
						return;
					}
				}
			}
		});
		threads[i++] = new Thread(new Runnable() {
			@Override
			public void run() {
				while(true)
				{
					try {
						c.put(MAGIC_NUMBER, MAGIC_NUMBER);
						System.out.println("-->Thread 6: Magic Number Inserted");
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						return;
					}
				}
			}
		});
		
		for(int j = 0; j < threads.length; j++)
			threads[j].start();
		
		try {
			Thread.sleep(100000);
		} catch (InterruptedException e) {
		}
		
		for(int j = 0; j < threads.length; j++)
			threads[j].interrupt();
	}

	public static void main(String[] args) {
		new Concurrenthashmap();
	}
}

Barrier in C#

class Program
{
    Barrier b = new Barrier(3);

    public Program()
    {
        Thread[] threads = new Thread[4];
        for (int i = 0; i < 4; i++)
        {
            threads[i] = new Thread(doSomething);
            threads[i].Start(i + 1);
        }

        Thread.Sleep(30000);

        for (int i = 0; i < 6; i++)
        {
            threads[i].Interrupt();
        }
    }

    void doSomething(object id)
    {
        int length = ((int)id) * 2;
        while (true)
        {
            try
            {
                Console.WriteLine("Thread " + id + ": Doing something for " + length + " seconds.");
                Thread.Sleep(length * 1000);
                Console.WriteLine("Thread " + id + ": Waiting");
                b.SignalAndWait();
            }
            catch (ThreadInterruptedException)
            {
                return;
            }
        }
    }

    static void Main(string[] args)
    {
        new Program();
    }
}

SemaphoreSlim in C#

class Program
{
    SemaphoreSlim sem = new SemaphoreSlim(2);

    public Program()
    {
        Thread []threads = new Thread[6];

        for (int i = 0; i < 6; i++)
        {
            int t = i + 1;
            threads[i] = new Thread(() => doSomething(t * 2, "Thread " + t));
            threads[i].Start();
        }
    }

    void doSomething(int length, string str)
    {
        sem.Wait();
        Console.WriteLine(str + ": Doing something for " + length + " seconds.");
        Thread.Sleep(length * 1000);
        sem.Release();
        Console.WriteLine(str + ": Done");
    }

    static void Main(string[] args)
    {
        new Program();
    }
}

CountdownEvent in C#

class Program
{
    CountdownEvent countdown = new CountdownEvent(3);

    public Program()
    {
        Thread t1 = new Thread(() => doSomething(4, "Thread 1"));
        Thread t2 = new Thread(() => doSomething(3, "Thread 2"));
        Thread t3 = new Thread(() => doSomething(2, "Thread 3"));

        t1.Start();
        t2.Start();
        t3.Start();

        t1.Join();
        t2.Join();
        t3.Join();
    }

    void doSomething(int length, string str)
    {
        Console.WriteLine(str + ": Doing Something for " + length);
        Thread.Sleep(length * 1000);
        Console.WriteLine(str + ": Done");
        countdown.Signal();
        Console.WriteLine(str + ": Waiting now");
        countdown.Wait();

        Console.WriteLine(str + ": Doing something else now for 3 seconds");
        Thread.Sleep(3000);
        Console.WriteLine(str + ": Done");
    }

    static void Main(string[] args)
    {
        new Program();
    }
}

Locks in C#

class Program
{
    class numberBasketClass
    {
        ArrayList al = new ArrayList();
        Object obj = new Object();
        public void LessThen10()
        {
            while (true)
            {
                lock (obj)
                {
                    Console.WriteLine("Start Adding 10");
                    for (int i = 0; i < 9; i++)
                        al.Add(i);
                    Console.WriteLine("Done Adding 10");

                    Thread.Sleep(2000);
                }
            }
        }

        public void LessThen20()
        {
            while (true)
            {
                lock (obj)
                {
                    Console.WriteLine("Start Adding 20");
                    for (int i = 10; i < 20; i++)
                        al.Add(i);
                    Console.WriteLine("Done Adding 20");
                }
            }
        }

        public void Keep15()
        {
            while (true)
            {
                lock (obj)
                {
                    Console.WriteLine("Start Removing");
                    while (al.Count > 100)
                        al.RemoveRange(0, al.Count - 100);
                    Console.WriteLine("Done Removing");
                    Thread.Sleep(2000);
                }
            }
        }
    }
    static void Main(string[] args)
    {
        numberBasketClass b = new numberBasketClass();

        Thread t1 = new Thread(new ThreadStart(b.LessThen10));
        t1.Start();

        Thread t2 = new Thread(new ThreadStart(b.LessThen20));
        t2.Start();

        Thread t3 = new Thread(new ThreadStart(b.Keep15));
        t3.Start();

        Thread.Sleep(10000);

        t1.Abort();
        t2.Abort();
        t3.Abort();
    }
}

Threading in C#

class Program
{
    static void Main(string[] args)
    {
        Thread t = new Thread(new ThreadStart(Work));
        t.Start();
        t.Join();

        Task <string> task = Task.Factory.StartNew<string>(() =>
            {
                Console.WriteLine("working for 4 seconds!");
                Thread.Sleep(4000);
                Console.WriteLine("done");
                return "NO ERROR.";
            });
        task.Wait();
        Console.WriteLine(task.Result);
    }

    static void Work()
    {
        Console.WriteLine("working for 3 seconds!");
        Thread.Sleep(3000);
        Console.WriteLine("done");
    }
}

Postfix Calculator in Java

Element.java

package com.tutorial;

public interface Element {
}

NumberElement.java

package com.tutorial;

public class NumberElement implements Element {
	Double number;
	public Double getNumber() {
		return number;
	}

	public NumberElement(String number) {
		this.number = Double.parseDouble(number);
	}
	
	public String toString()
	{
		return ((Integer)number.intValue()).toString();
	}
}

OperatorElement.java

package com.tutorial;

public class OperatorElement implements Element{
	static public enum OperatorType {MULTIPLY, DIVIDE, ADD, SUBTRACT, EXPONENTIAL, OPAREN, CPAREN};
	OperatorType type;
	Character c;
	public OperatorElement(Character operator) {
		c = operator;
		if(operator == '+')
			type = OperatorType.ADD;
		else if(operator == '-')
			type = OperatorType.SUBTRACT;
		else if(operator == '*')
			type = OperatorType.MULTIPLY;
		else if(operator == '/')
			type = OperatorType.DIVIDE;
		else if(operator == '^')
			type = OperatorType.EXPONENTIAL;
		else if(operator == '(')
			type = OperatorType.OPAREN;
		else if(operator == ')')
			type = OperatorType.CPAREN;
	}
	
	public String toString()
	{
		return c.toString();
	}
}

Parser.java

package com.tutorial;

import java.util.Collection;
import java.util.Vector;

public class Parser {
	Vector <Element> e = new Vector<Element>();
	public Collection<Element> Parse(String s)
	{
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < s.length(); i++)
		{
			Character c = s.charAt(i);
			if(Character.isDigit(c))
				sb.append(c);
			if(i + 1 < s.length())
			{
				Character d = s.charAt(i + 1);
				if(Character.isDigit(d) == false && sb.length() > 0)
				{
					e.add(new NumberElement(sb.toString()));
					//clears stringbuilder
					sb.delete(0, sb.length());
				}
			}
			
			if(c == '+' || c == '-' || c == '*' || c == '/' || c == '^'
					|| c == '(' || c == ')')
				e.add(new OperatorElement(c));
		}
		if(sb.length() > 0)
			e.add(new NumberElement(sb.toString()));
		
		return e;
	}
}

InfixToPostfix.java

package com.tutorial;

import java.util.Collection;
import java.util.Stack;
import java.util.Vector;

import com.tutorial.OperatorElement.OperatorType;

public class InfixToPostfix {
	Vector <Element> converted = new Vector<Element>();
	int Precedence(OperatorElement c)
	{
		if(c.type == OperatorType.EXPONENTIAL)
			return 2;
		else if(c.type == OperatorType.MULTIPLY || c.type == OperatorType.DIVIDE)
			return 3;
		else if(c.type == OperatorType.ADD || c.type == OperatorType.SUBTRACT)
			return 4;
		else
			return Integer.MAX_VALUE;
	}
	
	public void ProcessOperators(Stack<Element> st, Element element, Element top)
	{
		while(st.size() > 0 && Precedence((OperatorElement)element) >= Precedence((OperatorElement)top))
		{
			Element p = st.pop();
			if(((OperatorElement)p).type == OperatorType.OPAREN)
				break;
			converted.add(p);
			if(st.size() > 0)
				top = st.lastElement();
		}
	}
	public Collection<Element> ConvertFromInfixToPostFix(Collection<Element> e)
	{
		Vector <Element> stack1 = new Vector<Element>(e);
		Stack<Element> st = new Stack<Element>();
		for(int i = 0; i < stack1.size(); i++)
		{
			Element element = stack1.elementAt(i);
			if(element instanceof OperatorElement)
			{
				if(st.empty() ||
						((OperatorElement)element).type == OperatorType.OPAREN)
					st.push(element);
				else
				{
					Element top = st.lastElement();
					if(((OperatorElement)element).type == OperatorType.CPAREN)
						ProcessOperators(st, element, top);
					else if(Precedence((OperatorElement)element) < Precedence((OperatorElement)top))
						st.push(element);
					else
					{
						ProcessOperators(st, element, top);
						st.push(element);
					}
				}
			}
			else
				converted.add(element);
		}
		
		//pop all operators in stack
		while(st.size() > 0)
		{
			Element b1 = st.pop();
			converted.add(b1);
		}
		
		return converted;
	}
	
	public String toString()
	{
		StringBuilder s = new StringBuilder();
		for(int j = 0; j < converted.size(); j++)
			s.append(converted.elementAt(j) + " ");
		return s.toString();
	}
}

PostFixEvaluator.java

package com.tutorial;

import java.util.Collection;
import java.util.Stack;
import java.util.Vector;

import com.tutorial.OperatorElement.OperatorType;

public class PostFixEvaluator {
	Stack<Element> stack = new Stack<Element>();
	
	NumberElement calculate(NumberElement left, NumberElement right, OperatorElement op)
	{
		Double temp = Double.MAX_VALUE;
		if(op.type == OperatorType.ADD)
			temp = left.getNumber() + right.getNumber();
		else if(op.type == OperatorType.SUBTRACT)
			temp = left.getNumber() - right.getNumber();
		else if(op.type == OperatorType.MULTIPLY)
			temp = left.getNumber() * right.getNumber();
		else if(op.type == OperatorType.DIVIDE)
			temp = left.getNumber() / right.getNumber();
		else if(op.type == OperatorType.EXPONENTIAL)
			temp = Math.pow(left.getNumber(), right.getNumber());
		
		return new NumberElement(temp.toString());
	}
	public Double Evaluate(Collection<Element> e)
	{
		Vector <Element> v = new Vector<Element>(e);
		for(int i = 0; i < v.size(); i++)
		{
			Element element = v.elementAt(i);
			if(element instanceof NumberElement)
				stack.push(element);
			if(element instanceof OperatorElement)
			{
				NumberElement right = (NumberElement) stack.pop();
				NumberElement left = (NumberElement) stack.pop();
				NumberElement result = calculate(left, right, (OperatorElement)element);
				stack.push(result);
			}
		}
		return ((NumberElement)stack.pop()).getNumber();
	}
}

CalculatorTest.java

package com.tutorial;

import java.util.Collection;

public class CalculatorTest {

	public double Calculate(String s)
	{
		Parser p = new Parser();
		Collection<Element> e = p.Parse(s);
		InfixToPostfix i = new InfixToPostfix();
		e = i.ConvertFromInfixToPostFix(e);
		
		//debugging
		System.out.println("DEBUGGING: " + i.toString());
		//
		
		PostFixEvaluator pfe = new PostFixEvaluator();
		return pfe.Evaluate(e);
	}
	
	public static void main(String[] args) {
		CalculatorTest c = new CalculatorTest();
		double d = c.Calculate("4+6+9*8-(5*6+9)^2");
		System.out.println(d);
	}
}

CSV Parser (using State Machine) in Java

import java.util.ArrayList;

public class CSVParser {

	public enum OPstates
	{
		INITIAL(0),
		NORMAL(1),
		COMMA(2),
		OPEN_QUOTATION(9),
		CLOSE_QUOTATION(4),
		WHITE_SPACE(5),
		QUOTATION_IN_TOKEN(6),
		CLOSE_QUOTATION_IN_TOKEN(8),
		ERROR(-1),
		NEW_LINE(200);

		int i;
		private OPstates(int i) {
			this.i = i;
		}

		public int getValue()
		{
			return i;
		}
	}
	int [][] state = {	{1, 2, 3, 200, 5},      //0 initial state
						{1, 2, -1, 200, 1},     //1 normal character state
						{1, 2, 3, 200, 5},      //2 comma state
						{9, 9, 4, -1, 9},       //3 open quotation
						{-1, 2, 6, 200, 5},     //4 close quotation or quotation in token state
						{1, 2, 3, 200, 5},      //5 whitespace state
						{6, 6, 7, 200, 6},      //6 quotation in token
						{-1, -1, 8, -1, -1},    //7 close quotation
						{9, -1, 4, 200, 9},     //8 close quotation
						{9, 9, 4, -1, 9}        //9 open quotation state
					 };

	ArrayList<String> tokens = new ArrayList<String>();
	int TokenState(char token)
	{
		if(token == ',')
			return 1;
		else if(token == '"')
			return 2;
		else if(token == '\n')
			return 3;
		else if(token == ' ')
			return 4;
		else
			return 0;
	}

	void Parse(String input)
	{
		int curState = 0;
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < input.length(); i++)
		{
			char tokenChar = input.charAt(i);
			int tokenState = TokenState(tokenChar);
			curState = state[curState][tokenState];
			if(curState == OPstates.NORMAL.getValue() ||
					curState == OPstates.OPEN_QUOTATION.getValue() ||
					curState == OPstates.QUOTATION_IN_TOKEN.getValue() ||
					curState == OPstates.CLOSE_QUOTATION_IN_TOKEN.getValue())
				sb.append(tokenChar);

			if(curState == OPstates.COMMA.getValue() ||
					curState == OPstates.NEW_LINE.getValue())
			{
				tokens.add(sb.toString().trim());
				sb.delete(0, sb.length());

				if(curState == OPstates.NEW_LINE.getValue())
					break;
			}

			if(curState == OPstates.ERROR.getValue())
				throw new RuntimeException("Parse Error");
		}
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();

		for(int i = 0; i < tokens.size(); i++)
			sb.append("Token: " + tokens.get(i) + "\n");

		return sb.toString().trim() + "\n";
	}

	public CSVParser(String input) {
		Parse(input);
	}

	public static void main(String[] args) {
		String s = "   \"a\" ,    \"b,cd\"      ,   c ,\"vb,  n\",\",\"\n";
		System.out.println(s + new CSVParser(s));

		s = "    ,   a,b,\"c, l\",d,,5\n";
		System.out.println(s + new CSVParser(s));

		s = "h,\"john, jr\",a,b,\"c, l\",d,,5,\"e, jr\"\n";
		System.out.println(s + new CSVParser(s));

		s = "\"h, jk\",\"john, jr\",a,b,\"c, l\",d,,5,\"e's, jr\"\n";
		System.out.println(s + new CSVParser(s));

		s = "\"  e   \"\"abc\"\" n \"\"def\"\" \"\"buddy\"\"d\",\"b, jr\",  c dj n\n";
		System.out.println(s + new CSVParser(s));
	}
}

CyclicBarrier in Java

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {
	class runnable implements Runnable
	{
		int length;
		int id;
		public runnable(int id, int length) {
			this.length = length;
			this.id = id;
		}
		
		@Override
		public void run() {
			while(true)
			{
				try {
					System.out.println("Doing something for " + length + " seconds");
					Thread.sleep(length * 1000);
					System.out.println("Thread " + id + ": waiting");
					c.await();
				} catch (InterruptedException e) {
					return;
				} catch (BrokenBarrierException e) {
					return;
				}
				if(Thread.interrupted())
					return;
			}
		}
		
	}
	CyclicBarrier c = new CyclicBarrier(3);
	Thread t1;
	Thread t2;
	Thread t3;
	
	public CyclicBarrierTest()
	{
		t1 = new Thread(new runnable(1, 1));
		t2 = new Thread(new runnable(2, 3));
		t3 = new Thread(new runnable(3, 9));
		
		t1.start();
		t2.start();
		t3.start();
	}
	
	public void stop()
	{
		t1.interrupt();
		t2.interrupt();
		t3.interrupt();
	}
	public static void main(String[] args) {
		CyclicBarrierTest b = new CyclicBarrierTest();
		try {
			Thread.sleep(60000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		b.stop();
	}
}