java多线程学习(一)

1、概念

       线程就是办一件事的一个流程,里面包含了办一件事所需要的全部过程。注意不要和进程搞混,进程概念更大一点。

2、直接上学习案例

       以买景区门票为例,系统中有泰山景区和黄山景区各有门票50张,甲、乙两个组织分别开始买票,每次买5张,模拟一下这个过程。

(一)首先是顺序购买过程,不使用线程的实现方式

抢票组织

package thread;

public class Group {
	public String name;
	public int ticketNum;

	public Group(String name, int ticketNum) {
		this.name = name;
		this.ticketNum = ticketNum;
	}

	public void buyTicket(ViewPlace v) {
		try {
			// 为了表示买票时间,买票占用800毫秒
			Thread.sleep(800);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		v.totalTicketNum -= ticketNum;
		System.out.format("%s 正在购买 %s, %s的剩余票数 %d%n", name, v.name, v.name, v.totalTicketNum);

		if (v.isEmpty())
			System.out.println(v.name + "票卖光了!");
	}
}

景区

package thread;

public class ViewPlace {
	public String name;
	public int totalTicketNum;

	public ViewPlace(String name, int totalTicketNum) {
		this.name = name;
		this.totalTicketNum = totalTicketNum;
	}
	//卖光了
	public boolean isEmpty(){
		return 0>=totalTicketNum?true:false;
	}
}

单线程顺序购买

package thread;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Group g1 = new Group("上市公司", 5);
		Group g2 = new Group("民办企业", 5);
		ViewPlace v1 = new ViewPlace("泰山风景区", 50);
		ViewPlace v2 = new ViewPlace("黄山风景区", 50);
		//单线程顺序执行
		while(!v1.isEmpty()){
			g1.buyTicket(v1);
		}
		while(!v2.isEmpty()){
			g2.buyTicket(v2);
		}
	}

}

执行结果

 等一个组织购买完成第二个组织才会购买。

(二)实现线程类方式

编写BuyTicketThread类,继承Thread,实现其run方法,后续线程可并列执行。

package thread;

public class BuyTicketThread extends Thread{

	private Group g1;
	private ViewPlace v1;

	public BuyTicketThread(Group g1, ViewPlace v1) {
		this.g1 = g1;
		this.v1 = v1;
	}
	public void run(){
		while(!v1.isEmpty()){
			g1.buyTicket(v1);
		}
	}
}

执行线程并行测试

package thread;

public class TestMutilThread {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Group g1 = new Group("上市公司", 5);
		Group g2 = new Group("民办企业", 5);
		ViewPlace v1 = new ViewPlace("泰山风景区", 50);
		ViewPlace v2 = new ViewPlace("黄山风景区", 50);
		BuyTicketThread bt1=new BuyTicketThread(g1, v1);
		bt1.start();
		BuyTicketThread bt2=new BuyTicketThread(g2, v2);
		bt2.start();
	}
}

执行结果可以看出,两家机构正在同步进行买票,线程并行进展,互不影响。

 本节小结:当有几个可同步并行的流程需要同时处理时,顺序执行会很大的拖延执行时间,使用多线程可将各处理流程并行运行,提高运行效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值