黑马程序员-关于线程继承Thread和Runnable的对比

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


创建线程的第一种方式,继承Thread类。

1 继承Thread类
2 重写run()方法
3 调用对象的start()方法。

调用线程对象的start(),就开启了线程,运行线程的run()方法,同时。如果直接执行线程对象的run()方法,那就是普通的对象调用方法,没有开启线程,主线程中按顺序执行代码而已,还是单线程。

class Demo3 extends Thread{
	private String name;
	Demo3(String name){
		this.name=name;
	}
	public void run(){
		for(int i=0;i<=60;i++){
		System.out.println(name+"Demo run--"+i);
		}
	}
}

public class ThreadDemo {
	public static void main(String[]args){
		Demo3 d=new Demo3("111111");
		Demo3 a=new Demo3("222222");
		d.start();
		a.start();
		
		for(int i=0;i<=60;i++){
			System.out.println("Main run------"+i);
		}
	}
}


创建线程的第二种方式:实现Runable接口

1 定义类实现Runnable接口
2 覆盖Runnable接口中的run方法。将线程要运行的代码放入run方法中。
3 通过Thread类建立线程对象。
4 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。因为自定义的run方法所属的对象是 Runnable接口的子类对象。所以要让线程去执行指定对象的 run方法。就必须明确该run方法所属对象。

5 调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

下面用一个卖票的例子就能很清晰的看出二者的区别:

用Thread的:

class Ticket extends Thread{
	static private int tick=100;
	private String name;
	public Ticket(String name){
		this.name=name;
	}
	public void run(){
		while(true){
			if(tick>0){
			System.out.println(name+" sale: "+tick--);
		}
		}	
	}
}
public class Maipiao {
	public static void main(String []args){
		Ticket t1=new Ticket("111");
		Ticket t2=new Ticket("222");
		Ticket t3=new Ticket("333");
		Ticket t4=new Ticket("444");
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}
因为ticket是静态的,所以4个线程类共享这100个资源。因为是继承的Thread,所以只能看到1个线程,从100执行到1,一共执行了100次,其余3个不执行。如果ticket不是静态的,那么4个线程都会不间断的执行100次。

用Runnable的:

class Ticket implements Runnable{
	private int tick=100;
	Object obj=new Object();
	public void run(){
		while(true){
			synchronized(obj){
			if(tick>0){
				try{Thread.sleep(10);}catch(Exception e){}
			System.out.println(Thread.currentThread().getName()+" sale: "+tick--);
			}
			}
		}	
	}
}

public class Maipiao{
	public static void main(String []args){
		Ticket t=new Ticket();
		Thread t1=new Thread(t);
		Thread t2=new Thread(t);
		Thread t3=new Thread(t);
		t1.start();
		t2.start();
		t3.start();
		
	}
}

因为是继承了Runnable,所以4个线程并发执行这100个资源。

实现方式的好处:避免了单继承的局限性。建议使用实现方式。

两种方式的区别:继承Thread:线程代码放在Thread子类run方法。实现runnable,线程代码存在接口的子类run方法中。

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值