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();
}
}
执行结果可以看出,两家机构正在同步进行买票,线程并行进展,互不影响。
本节小结:当有几个可同步并行的流程需要同时处理时,顺序执行会很大的拖延执行时间,使用多线程可将各处理流程并行运行,提高运行效率。