java多线程学习(二)

        前一节学了点多线程基础概念,了解了一下多线程的最简单的实现方式,在很多场景中,多线程的实现确实比程序顺序执行效率会高很多。今天学习集中多线程的实现方式,主要有实现专门的线程类,如上一节的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();
	}
}

执行结果,也是毫无疑问的并行处理完成。

小结:多线程的几种处理方式,各有优劣,其实殊途同归,根据场景择优选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值