码迷,mamicode.com
首页 > 编程语言 > 详细

多线程之多窗口卖票&线程之间的通信

时间:2015-08-11 21:33:58      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:多线程

案例一:使用多线程完成三个窗口卖票(不能出现重复卖票以及负数票)

卖票程序SellTicket 这里使用Lock类中的方法实现加锁和释放锁!

package cn.itcast.thread2;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SellTicket implements Runnable {
	private int tickets = 100;
	private Lock lock=new ReentrantLock();
	private Object obj=new Object();
	@Override
	public void run() {
		while (true) {
			lock.lock();//这里也可以使用synchronized(obj){if中的代码} 要使用同一把锁
				if (tickets > 0) {
					try {
						Thread.sleep(100);// 休息一会
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()
							+ "正在卖第" + tickets-- + "张票");
				}
			lock.unlock();//释放锁
		}
	}

}
测试类

package cn.itcast.thread2;

public class SellTicketTest {
	public static void main(String[] args) {
		SellTicket s1=new SellTicket();
		Thread t1=new Thread(s1);
		Thread t2=new Thread(s1);
		Thread t3=new Thread(s1);
		t1.setName("窗口一");
		t2.setName("窗口二");
		t3.setName("窗口三");
		t1.start();
		t2.start();
		t3.start();
	}
}
案例二:线程之间的通信

线程之间的通信就是对同一个数据的操作:举例说明-->

如卖包子,如果包子铺没有包子就让生产商产包子,同时顾客等待.如果包子铺有包子就卖包子,生产商就不能产包子,就等待包子铺卖完后才能生产包子!因此生产商等待!

技术分享

代码:

学生类Student

package cn.itcast.thread3;

public class Student {
	int age;
	boolean flag;//默认是没有数据的false 如果有数据就为true
	 String name;
}
设置线程:

package cn.itcast.thread3;
/**
 * 线程之间的通信
 * 如果有学生就不set了
 * @author Administrator
 *
 */
public class SetThread implements Runnable{
	public Student s;
	private int x=0;
	public SetThread(Student s){
		this.s=s;
	}
	@Override
	public void run() {
		while(true){
			synchronized (s) {//把要操作的student对象当成锁对象
				if(s.flag){//判断有没有数据  如果有数据了就等着释放锁
					try {
						s.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				//没有数据 就创建数据
				if(x%2==0){//是偶数就创建李卫康
					s.name="李卫康";
					s.age=23;
				}else{//是奇数就创建韩玮
					s.name="韩玮";
					s.age=22;
				}
				x++;//x++
				//如果已经设置了数据就更改标记
				s.flag=true;//有数据了就等着 因此说更改标记为true
				s.notify();//唤醒
			}
		}
	}

}
获取线程:

package cn.itcast.thread3;

public class GetThread implements Runnable{
	public Student s;
	public GetThread(Student s){
		this.s=s;
	}
	@Override
	public void run() {
		while(true){
			synchronized (s) {
				if(!s.flag){//如果flag是false说明没有数据就不获取数据了就等着
					try {
						s.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				//有数据就打印
				System.out.println("学生的姓名和年龄分别是:"+s.name+":"+s.age);
				//修改标记
				s.flag=false;//没数据了就等着
				//唤醒
				s.notify();//
			}
		}
	}

}
测试类:

package cn.itcast.thread3;

public class Test {
	public static void main(String[] args) {
		//创建资源
		Student s=new Student();
		//设置和获取的类
		GetThread get=new GetThread(s);
		SetThread set=new SetThread(s);
		Thread t1=new Thread(get);
		Thread t2=new Thread(set);
		//启动线程
		t1.start();
		t2.start();
	}
}
运行结果:

技术分享








版权声明:本文为博主原创文章,未经博主允许不得转载。

多线程之多窗口卖票&线程之间的通信

标签:多线程

原文地址:http://blog.csdn.net/u014010769/article/details/47426237

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!