java 다중 루틴 문제에서 간단한 입금 실현

2743 단어 ReentrantLock
1. 코드에 직접 올리기:
package com.mnmlist.java.grammar;

import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

class Customer {
	int total;
	public Customer() {
		total = 0;
	}

	public final ReentrantLock lock = new ReentrantLock();//   1:lock      final
	Random random = new Random();
	public void put(int num) {

		System.out.println(Thread.currentThread().getName()+":before put "+num+" ,total:" + total);
		total += num;
		System.out.println(Thread.currentThread().getName()+":after put:" + num + ",total:" + total);

	}

	public void get(int num) {
		System.out.println(Thread.currentThread().getName()+":before get "+num+" ,the total is:" + total);
		total -= num;
		System.out.println(Thread.currentThread().getName()+":after get " + num + " ,the total is:" + total);
	}
}

class PutMoney implements Runnable {
	Customer customer;

	public PutMoney(Customer customer) {
		this.customer = customer;
	}

	public void run() {
		int num = 0;
		while (true) {
			num = customer.random.nextInt(100);
			if (num < 0)
				num = -num;
			customer.lock.lock();
			if (customer.total + num <0) {
				customer.lock.unlock();
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} else {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				customer.put(num);
				customer.lock.unlock();
			}
		}
	}

}

class GetMoney implements Runnable {
	Customer customer;

	public GetMoney(Customer customer) {
		this.customer = customer;
	}

	public void run() {
		int num = 0;
		while (true) {
			num = customer.random.nextInt(100);
			if (num < 0)
				num = -num;
			customer.lock.lock();
			if (customer.total - num < 0) {
				customer.lock.unlock();
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} else {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				customer.get(num);
				customer.lock.unlock();
			}
		}
	}
}

public class BankTheadDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Customer customer = new Customer();
		PutMoney putMoney = new PutMoney(customer);
		GetMoney getMoney = new GetMoney(customer);
		Thread t1 = new Thread(putMoney);
		Thread t2 = new Thread(getMoney);
		t2.start();
		t1.start();
		
	}

}

2. 그림도 있고 진실도 있다

좋은 웹페이지 즐겨찾기