All pastes #198366 Raw Edit

Anonymous

public text v1 · immutable
#198366 ·published 2006-10-11 23:04 UTC
rendered paste body
import java.util.concurrent.*;
import java.util.concurrent.locks.*;

public class ThreadCooperation {
	private static Account account = new Account();
	
	public static void main(String[] args) {
		ExecutorService executor = Executors.newFixedThreadPool(2);
		System.out.println("Thread 1\t\tThread 2\t\tBalance");
		executor.execute(new WithdrawTask());
		executor.execute(new DepositTask());
		executor.shutdown();
		//while (!executor.isTerminated()) {}
	}

	public static class DepositTask implements Runnable {
		public void run() {
			try {
				while (true) {
					account.deposit((int)(Math.random() * 10) + 1);
					Thread.sleep(1);
				}
			}
			catch (InterruptedException ex) {ex.printStackTrace();}
		}
	}
	
	public static class WithdrawTask implements Runnable {
		public void run() {
			while (true) {
				account.withdraw((int)(Math.random() * 10) + 1);
			}
		}
	}
	
	private static class Account {
		private static Lock lock = new ReentrantLock();
		private static Condition newDeposit = lock.newCondition();
		private int balance = 0;
		
		public int getBalance() {
			return balance;
		}
		
		public void withdraw(int amount) {
			lock.lock();
			try {
				while (balance < amount)
					newDeposit.await();
				balance -= amount;
				System.out.println("\t\t\tWithdraw " + amount + "\t\t" + getBalance());
			}
			catch (InterruptedException ex) {ex.printStackTrace();}
			finally {
				lock.unlock();
			}
		}
		
		public void deposit(int amount) {
			lock.lock();
			try {
				balance += amount;
				System.out.println("Deposit " + amount + "\t\t\t\t\t" + getBalance());
				newDeposit.signalAll();
			}
			finally {lock.unlock();}
		}
	}
}