Runnable和Threadqu区别分析

首先一个是抽象类一个是接口,让我们回顾下抽象类和接口有什么不同。

抽象类和接口的区别如下:

1、在类继承抽象类时,只要实现部分具体的方法和全部抽象方法,而实现接口而实现接口则要实现里面的全部方法。

2、接口中的可以有成员变量,但是所有ude成员变量都必须是最终变量而已。

 

 

虽然Thread和runnable实现的功能是一样的,但是runnable是面向接口,扩展性等方面比extends Thread好,简单的说因为Java是单继承,如果你一个类,需要实现线程,又要继承一个类,显然,使用Thread是不行的。建议使用Runnable面向接口的!

 

线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法,
我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样.

你简单的调用run方法是没有这样效果的,所以你必须调用Thread类的start方法来启动你的线程.所以你启动线程有两种方法
一是写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程
二是写一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable target).start()方法来启动

这两种方法都必须实现RUN方法,这样线程起动的时候,线程管理器好去调用你的RUN方法.

 

下面用例子描述用runnable和thread实现线程的一个重要区别点

 

要理解两者的区别首先我要啰嗦下一个知识点

关于synchronized造成的线程同步:

 

1、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 

2、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 

3、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 

4、当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 

 

用thread产生的线程:

 

public class test extends Thread{
	public void run(){
		synchronized(this){
		for(int i=0;i<5;i++){
	System.out.println(Thread.currentThread().getName()+"   synchronizedloop "+i);	
		}
		}

	}
	public static void main(String args[])
	{
		test s1=new test();
		test s2=new test();
	s1.start();
	s2.start();
	}
	}

 运行的结果是:

 



 

使用Thread创建了两个线程,而这两个线程中synchronized(this)的this并不指向同一对象而是分别指向S1和S2对象,所以会交叉执行。


 用runnable产生的线程:

 

public class test1 implements Runnable {
	public void run() {
		synchronized(this)
	{
		for(int i=0;i<5;i++)
		{
			System.out.println(Thread.currentThread().getName()
					+" synchronizedloop "+i);
		}
		
	}
		
	}
	public static void main(String args[])
	{
		test1 t1=new test1();
		Thread ta=new Thread(t1,"A");
		Thread tb=new Thread(t1,"B");
		ta.start();
		tb.start();
	}
	

}

 运行结果是:

 



 

使用Runnable接口创建的接口使用同一个对象t1,t1中的synchronized(this)把所以通t1创建的线程加上了互斥锁,所以实现了Runnable接口的线程不是交叉的。

 

一个Thread对象只能开启一个线程,而一个实现了Runnable接口的对象可以开启多个线程.,能够通过synchronized关键字来控制线程执行的顺序。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值