黑马程序员_java基础多线程

------ <a href="http://www.itheima.com" target="blank">Windows Phone 7手机开发</a>、<a href="http://www.itheima.com" target="blank">.Net培训</a>、期待与您交流! -------

/*多线程部分学习心得*/
//懒汉式 考点:1延迟加载2双重判断减少判断次数3synchronized的参数是类的字节码对象,非静态方法才使用默认的this锁
class single {
	
	private static single getInstance()
	{
		if(s==null)
		{
			synchronized(single.class)
			{
				if(s==null)
					s=new single();
			}
		}return s;
	}
}
//写个死锁程序 考点:同步中嵌套同步,锁却不同。
class Ticket implements Runnable
{
	private int tick = 100;
	Object obj =new Object;
	boolean flag = true;
	public void run()
	{
		if(flag)
		{
			while(true)
		{
				synchronized(obj)
				{
					show();
				}
		}
	}
		else 
			while(true)
				show();
	}
	public synchronized void show()
	{
		synchronized(obj)
		{
			if(tick>0)
			{
				try{Thread.sleep(10);}
				catch(Exception e){}
				System.out.println(Thread.currentThread().getName()+"...sale: "+ tick--);
			}
		}
	}
}
class DeadLockDemo
{
	public static void main(String[] args)
	{
		//构建新对象
		Ticket t = new Ticket();
		
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		t1.start();
		try{Thread.sleep(10);}
		catch(Exception e){}
		t.flag = false;
		t2.start();
	}
}
//线程间通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。
/*
 * 思路:车一存在就有煤,所以车初始化就定义煤。有可能资源属性不完整就切换了进程。线程实现同步
 * 的前题是1多(两)个线程共同操作资源的代码块要加上synchronized;2用的是同一把锁。
 * 等待唤醒机制:为了满足输入一个取出一个,在资源中添加一个标记,判断为ture时,就冻结同时唤醒另一线程。
 * 等待线程都存在线程池中的线程,notify通常唤醒第一个等待的线程。wait,notify,notifyAll都使用在同步
 * 中,因为要对持有监视器(锁)的线程操作。
 * 数据私有,提供方法。
 * 生产者消费者,while循环,notifyAll
 * 
 * 步骤
 * 1 描述资源
 * 2 描述输入的run
 * 3 描述输出的run
 * 
 * 
 * */
class ProducerConsumerDemo {
//主函数
	public static void main(String[] args)
	{
		Resource r = new Resource();
		
		Producer pro = new Producer(r);
		Consumer con = new Consumer(r);
		
		Thread t1 = new Thread(pro);
		Thread t2 = new Thread(pro);
		Thread t3 = new Thread(pro);
		Thread t4 = new Thread(pro);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}
	//资源
class Resource {
	private String name;
	private int count = 1;
	private boolean flag = false;
	
//方法要有自己的参数
public synchronized  void set(String name) {
	
	while(flag)
	//是真,就等待,注意格式
	try{this.wait();}
	catch(Exception e){}
	//判断是否执行
	//带有编号地赋值
	//首先,写出构造方法,带线程名称更直观,产品名称
	this.name = name+"--"+count++;
	//力求代码简单
	System.out.println(Thread.currentThread().getName()+"...生产者..."+name);
	//唤醒程序
	flag =true;
	this.notifyAll();
}
			
//生产者

//消费者没有默认参数
public synchronized void out() {
		while(!flag)
		//是假,就等待,注意格式
		try{this.wait();}
		catch(Exception e){}
		//判断是否执行
		//带有编号地赋值
		//首先,写出构造方法,带线程名称更直观,产品名称
		//力求代码简单
		System.out.println(Thread.currentThread().getName()+"...消费者....."+name);
		//唤醒程序
		flag =false;
		this.notifyAll();
	}
}

class Producer implements Runnable
{
	private Resource res;
	
	Producer(Resource res)
	{
		this.res = res;
	}
	public void run()
	{
		while(true)
		{//在不断设置值,类.方法名
			res.set("+商品+");
		}
	}
}
class Consumer implements Runnable
{
	private Resource res;
	
	Consumer(Resource res)
	{
		this.res = res;
	}
	public void run()
	{
		while(true)
		{//消费者在不断消费
			res.out();
		}
	}
}
/**当没有指定的方法让冻结的线程恢复到运行状态时,
 * 这时需要对冻结进行清除。强制让线程恢复到运行状态。
 * Thread类提供了interrupt方法。
 * join抢夺cpu执行权。它结束了,主线程才恢复到执行状态。
 * join可临时加入线程执行。
 * t1.setPriority(Thread.MAX_PRIORITY);
 * Thread.yield();可稍微减缓线程的运行,具有平均执行的作用。
 * 单独封装成一个线程:独立运算,相互不相关,提高效率的方法。
  */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值