浅谈Runnable和Thread的区别

本文对比分析了Java中Thread类与Runnable接口的特点与使用方法,并通过示例代码展示了它们在线程创建与资源共享方面的区别。

        在我们需要实现多线程的过程中,毫无例外会用到Thread和Runnable这两个类和接口,所以,我简单的对这两个类做了一下分析,与大家分享一下

        首先说说他们的共同点:
                    1   他们都可以实现多线程的操作,
                    2   他们都需要实现run方法
         不同点就是他们一个是接口,而另一个是类,我们在实现多线程的时候,由于子类继承父类只能继承一个,但是可以实现多个接口,而且也可以实现资源的共享,所以我们多数采用的是实现Runnable这个接口,但是他需要创建Tread对象的start()方法来开启线程,所以说,也是各有利弊
          (Thread类继承自Runnable接口)
            下面,通过一段代码看看他们的不同
  
                1Runnable 需要创建Thread对象开启线程           
public class Test implements Runnable{
	

	@Override
	public void run() {
		System.out.println("我是runnable线程");
		
	}
	public static void main(String[] args) {
		  Test t = new Test();
		  Thread thread = new Thread(t);
		  thread.start();
		  
	}
	}
             2Thread可以直接开启线程
         
public class Test extends Thread{
	

	@Override
	public void run() {
		System.out.println("我是thread线程");
		
	}
	public static void main(String[] args) {
		  Test t = new Test();
		  t.start();
		  
	}
	}
              关于资源共享的问题

               3实现Thread类

            

public class Test extends Thread{
	

	@Override
	public void run() {
		for(int i=0;i<10;i++){
			
			System.out.println("我是thread线程"+i);
		}
		
	}
	public static void main(String[] args) {
		  Test t1 = new Test();
		  Test t2 = new Test();
		  Test t3= new Test();
		  t1.start();
		  t2.start();
		  t3.start();
		  
		  
	}
	}
          结果是(没有全部粘过来)

       我是thread线程0
我是thread线程1
我是thread线程0
我是thread线程0
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
我是thread线程5
我是thread线程6
我是thread线程7
我是thread线程8
我是thread线程9
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
                  3实现Runnable接口
public class Test implements Runnable{
	

	@Override
	public void run() {
		for(int i=0;i<10;i++){
			
			System.out.println("我是thread线程"+i);
		}
		
	}
	public static void main(String[] args) {
		  Test t =new Test();
		  new Thread(t).start();
		  new Thread(t).start();
		  new Thread(t).start();
		  
	}
	}
                 结果
我是thread线程0
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
我是thread线程5
我是thread线程6
我是thread线程7
我是thread线程8
我是thread线程9
我是thread线程0
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
我是thread线程5
我是thread线程0
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
我是thread线程5
我是thread线程6
我是thread线程7
我是thread线程8
我是thread线程9
我是thread线程6
我是thread线程7
我是thread线程8
我是thread线程9
                显而易见的是在用Thread实现多线程的过程中,需要我们创建多个对象,但是在实现Runnable的过程中,只需要创建一个对象,由多个线程去共享其中的资源
 
             最后,说个题外话,除了这两个方法实现多线程以外,还有一个Callable接口可以实现多线程,但是他实现的是call方法,而且他有返回值,并且可以抛出多个异常,自处理事件等许多亮点了,但是由于他的实现特别繁琐还有其它的种种原因,现在不是很常用,所以大家了解一下就可以了

### Java 中 `Runnable` 接口与 `Thread` 类的主要区别 在 Java 的多线程编程中,`Runnable` 接口 `Thread` 类都用于创建并管理线程。然而两者之间存在一些重要的差异。 #### 继承 vs 实现接口 由于 Java 不支持多重继承,如果一个类已经继承了其他父类,则不能再通过继承的方式扩展 `Thread` 类的功能。此时可以考虑让该类实现 `Runnable` 接口[^2]。而当不需要额外的状态信息时,直接使用 `Thread` 可能更加方便简单。 #### 资源共享 当多个相同类型的对象需要被不同的线程处理时,采用 `Runnable` 方式更有利于资源共享。因为可以通过传递同一个实例给不同线程来达到目的;相反地,基于子类化 `Thread` 来构建新线程会使得每个线程都有独立的对象副本[^3]。 #### 代码示例对比 以下是两种方式的具体实现: ##### 使用 `Thread` ```java public class MyThread extends Thread { @Override public void run() { System.out.println("MyThread 当前线程是:" + Thread.currentThread().getName()); } } ``` 调用此线程的方法如下所示: ```java new MyThread().start(); ``` ##### 使用 `Runnable` ```java public class Task implements Runnable { private final String message; public Task(String msg){ this.message=msg; } @Override public void run(){ System.out.println(message+" from "+Thread.currentThread().getName()); } } // 创建并启动线程 Thread thread = new Thread(new Task("Hello")); thread.start(); ``` 上述例子展示了如何利用外部参数初始化任务,并将其交给新的工作线程去执行[^5]。 #### 总结 虽然从技术角度讲,这两种方法都可以用来创建线程,但在实际应用中推荐优先选用 `Runnable` 或者更新的 `Callable` 接口配合 `ExecutorService` 框架来进行并发控制,这样不仅提高了灵活性还增强了可读性维护性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KeepMoving00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值