前一节学了点多线程基础概念,了解了一下多线程的最简单的实现方式,在很多场景中,多线程的实现确实比程序顺序执行效率会高很多。今天学习集中多线程的实现方式,主要有实现专门的线程类,如上一节的BuyTicketThread类,集成Thread类,实现其run方法,并在使用时直接使用不同引用来初始化对象并start多个线程开始并行执行。还有两种方法今天了解一下。
(一)直接在需要使用多线程的地方,初始化Thread的匿名引用,并直接在初始化时重写run方法,该方式可直接使用初始化线程的类中的各种变量,但此种方法个人感觉略微笨重,除非使用类似多线程流程处理的地方很少,可直接使用,不然不推荐使用。
上程序,上一节的那种多线程的实现方式代码,在本代码中已被注释。
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();
Thread t1=new Thread(){
public void run(){
while(!v1.isEmpty()){
g1.buyTicket(v1);
}
}
};
Thread t2=new Thread(){
public void run(){
while(!v2.isEmpty()){
g2.buyTicket(v2);
}
}
};
t1.start();
t2.start();
}
}
执行结果与第一种方式是同样的。
(二)多线程中还有一个Runnable接口类,这个接口存在的意义,目前学习的情况来看,是为了解决java类单继承的问题,因为一旦有一个类继承了某个父类,再想去集成Thread就不可能了,所以才出现了Runnable接口,个人理解,有误勿喷。
上程序,实现接口run方法
package thread;
public class BuyTicket implements Runnable{
private Group g1;
private ViewPlace v1;
public BuyTicket(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);
BuyTicket bt1=new BuyTicket(g1, v1);
new Thread(bt1).start();
BuyTicket bt2=new BuyTicket(g2, v2);
new Thread(bt2).start();
// BuyTicketThread bt1=new BuyTicketThread(g1, v1);
// bt1.start();
// BuyTicketThread bt2=new BuyTicketThread(g2, v2);
// bt2.start();
// Thread t1=new Thread(){
// public void run(){
// while(!v1.isEmpty()){
// g1.buyTicket(v1);
// }
// }
// };
// Thread t2=new Thread(){
// public void run(){
// while(!v2.isEmpty()){
// g2.buyTicket(v2);
// }
// }
// };
// t1.start();
// t2.start();
}
}
执行结果,也是毫无疑问的并行处理完成。
小结:多线程的几种处理方式,各有优劣,其实殊途同归,根据场景择优选择。