首先一个是抽象类一个是接口,让我们回顾下抽象类和接口有什么不同。
抽象类和接口的区别如下:
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关键字来控制线程执行的顺序。
相关推荐
在Java编程语言中,多线程的实现有多种方式,其中最常见的是通过继承`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景,理解它们之间的区别对于编写高效、可维护的多线程应用至关重要。 ### 继承...
在创建线程时,我们通常会遇到两种主要的方式:实现`Runnable`接口和继承`Thread`类。虽然两者都能实现多线程,但它们之间存在着重要的区别,这些差异主要体现在设计模式、内存共享、线程的创建以及线程的生命周期...
### 多线程的Runnable与Thread的区别 在Java中实现多线程有两种主要方式:一种是继承`Thread`类;另一种是实现`Runnable`接口。本文将深入探讨这两种方法的区别,帮助初学者更好地理解并选择适合场景的多线程实现...
这两种方法都有其特点和适用场景,下面我们详细分析它们的优缺点。 首先,让我们看看继承`Thread`类的方法。`Thread`类是Java语言内置的用于处理并发的类,位于`java.lang`包中。当一个类继承`Thread`,并覆盖其`...
在Android应用开发中,Handler、Runnable和Looper是三个非常重要的组件,它们构成了Android的消息处理机制。这个机制使得UI线程可以非阻塞地处理来自其他线程的消息,从而避免了UI冻结,提升了用户体验。下面我们将...
在Android开发中,`Runnable`和`Handler`是两种常用且关键的组件,它们在创建异步任务和处理UI更新方面发挥着重要作用。本示例的`android demo`旨在演示如何利用`Runnable`和`Handler`来实现一个每3秒执行一次的任务...
虽然这些在`Runnable`实例中没有直接体现,但了解它们对于理解和使用多线程至关重要。 1. `synchronized`:用于同步访问共享资源,确保同一时间只有一个线程能执行特定代码块。 2. `wait()`, `notify()`, `...
在Java中,线程是程序执行的最小单位,而创建线程主要有两种方式:继承Thread类和实现Runnable接口。本项目是一个Java小游戏,核心功能是键盘打字练习,允许用户根据屏幕显示的字符进行快速输入,以提升打字速度,...
在Java编程语言中,创建线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。由于Java的单继承特性,当一个类需要继承其他类时,就不能再直接继承`Thread`,这时实现`Runnable`接口就成为创建线程的优选方案。...
Thread 线程类是 Java 中 Thread 和 Runnable 接口的实现,它提供了线程的基本操作和管理。下面是对 Thread 类的详细介绍: 1. Runnable 接口 Runnable 接口是 Thread 类的基类,它提供了 run() 方法,该方法是...
详解Java中Thread和Runnable区别 Java中Thread和Runnable是两个不同的概念,它们都是Java中的线程机制,但是它们之间有着本质的区别。 Thread是Java中的一个类,而Runnable是一个接口。Thread类实现了Runnable接口...
Java提供了两种主要的方式来创建线程:继承Thread类和实现Runnable接口。本篇文章将深入探讨通过实现Runnable接口来创建线程的方法,以及这种方式相比于直接继承Thread类的优势。 首先,我们来看Runnable接口。在...
线和的应用 runnable接口 runnable接口 runnable接口 runnable接口 runnable接口
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。
大家都知道Runnable和Callable接口都可以作为其他线程执行的任务,但是Runnable接口的run方法没有返回值,而Callable接口的call方法有返回值,那么Callable接口是如何做到的呢?在此我给出一个Demo,看看通过...
Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...
"认识Thread和Runnable" Thread 和 Runnable 是 Java 中实现多线程的两种方式。继承 Thread 类或者实现 Runnable 接口可以实现多线程。Runnable 接口建议使用,因为它可以实现多继承,并且只有一个 run 方法,很...
MapReduce可以帮助开发者在分布式环境中有效地处理海量数据,而泛型、匿名内部类以及Runnable和Callable接口则为Java编程提供了强大的工具,使我们能够编写更加灵活、安全和高效的代码。在实际开发中,结合这些技术...
在Java中,有两种主要的方法来创建线程:通过继承`Thread`类和实现`Runnable`接口。本篇文章将深入探讨如何使用`Runnable`接口创建线程,并与`Thread`类创建线程的方式进行比较。 首先,我们来看`Runnable`接口。`...
在Java编程语言中,创建和管理多线程有两种主要的方式:继承`Thread`类和实现`Runnable`接口。这两种方式都是为了实现并发执行任务,但它们之间存在一些关键的区别。 首先,当我们创建一个新的线程时,实际上是为了...