java 线程 学习笔记

1.创建

Thread thread = new Thread(task); //task为一个实现Runnable接口的任务实例

2.开始

thread.start();

3.线程池

ExecutorService executor = Executor.newFixedThreadPool(3);//创建一个最大线程数为3的线程池

executor.execute(任务1);

executor.execute(任务2);

executor.shutdown();//不再接受新任务,但会把当前的做完

4.synchronized关键字

synchronized(account){

account.deposit(1);

}

或者 public synchronized void deposit(double amount)在方法中加


5.利用加锁同步

  • private static Lock lock=new ReentrantLock();
  • private static Condition newDeposit=lock.newCondition();
  • //一个条件对应一个锁
  • lock.lock();获取锁
  • newDeposit().await();//让存款任务进入休眠,等待sign
  • newDeposit().signAll();//通知所有该条件的等待进程
  • lock.unlock();释放锁
  • 注意:条件是由锁创建的,为了调用条件的方法,必须首先拥有锁!!!

public class ThreadCooperation {

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

		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
			while(true){
				account.deposit((int)(Math.random()*10)+1);
				Thread.sleep(1000);
			}
			}
			catch(Exception e){
				e.printStackTrace();
			}
		}
		
	}
	public static class WithdrawTask implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(true){
				account.withdraw((int)(Math.random()*10+1));
				
			}
		}
		
	}
	
	
}
class Account2{
	private int balance=0;
	
	private static Lock lock=new ReentrantLock();
	private static Condition newDeposit=lock.newCondition();
	
	public int getBalance(){
		return balance;
	}
	
	public void withdraw(int amount){
		lock.lock();
		try{
			while(balance<amount){
				System.out.println("\t\t\tWait for a deposit");
				newDeposit.await();
			}
			balance-=amount;
			System.out.println("\t\t\tWithdraw "+amount+"\t\t"+getBalance());
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
			lock.unlock();
			
		}
	}
	
	public void deposit(int amount){
		lock.lock();
		balance+=amount;
		System.out.println("Deposit "+amount+"\t\t\t\t\t"+getBalance());
		newDeposit.signalAll();
		
		lock.unlock();
		}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值