Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:
◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;
◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。
在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程类的时候是通过扩展 Thread类的方法来实现的,那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能。因此,如果自定义类必须扩展其他的类,那么就可以使用实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性。
还有一点最重要的就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享.
(1)通过扩展Thread类来创建多线程
假设一个影院有三个售票口,影院为每个窗口放有100张电影票,三个窗口需要同时卖票,而现在只有一个售票员,这个售票员就相当于一个CPU,三个窗口就相当于三个线程。通过程序来看一看是如何创建这三个线程的。
public class MutliThreadDemo { public static void main(String [] args){ MutliThread m1=new MutliThread("Window 1"); MutliThread m2=new MutliThread("Window 2"); MutliThread m3=new MutliThread("Window 3"); m1.start(); m2.start(); m3.start(); } } class MutliThread extends Thread{ private int ticket=100;//每个线程都拥有100张票 MutliThread(String name){ super(name);//调用父类带参数的构造方法 } public void run(){ while(ticket>0){ System.out.println(ticket--+" is saled by "+Thread.currentThread().getName()); } } }
(2)通过实现Runnable接口来创建多线程
public class MutliThreadDemo2 { public static void main(String [] args){ MutliThread m1=new MutliThread("Window 1"); MutliThread m2=new MutliThread("Window 2"); MutliThread m3=new MutliThread("Window 3"); Thread t1=new Thread(m1); Thread t2=new Thread(m2); Thread t3=new Thread(m3); t1.start(); t2.start(); t3.start(); } } class MutliThread implements Runnable{ private int ticket=100;//每个线程都拥有100张票 private String name; MutliThread(String name){ this.name=name; } public void run(){ while(ticket>0){ System.out.println(ticket--+" is saled by "+name); } } }
由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和(1)结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。
可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。
(3)通过实现Runnable接口来实现线程间的资源共享
现实中也存在这样的情况,比如模拟一个火车站的售票系统,假如当日从A地发往B地的火车票只有100张,且允许所有窗口卖这100张票,那么每一个窗口也相当于一个线程,但是这时和前面的例子不同之处就在于所有线程处理的资源是同一个资源,即100张车票。如果还用前面的方式来创建线程显然是无法实现的,这种情况该怎样处理呢?看下面这个程序,程序代码如下所示:
public class MutliThreadDemo3 { public static void main(String [] args){ MutliThread m=new MutliThread(); Thread t1=new Thread(m,"Window 1"); Thread t2=new Thread(m,"Window 2"); Thread t3=new Thread(m,"Window 3"); t1.start(); t2.start(); t3.start(); } } class MutliThread implements Runnable{ private int ticket=100;//每个线程都拥有100张票 public void run(){ while(ticket>0){ System.out.println(ticket--+" is saled by "+Thread.currentThread().getName()); } } }
结果正如前面分析的那样,程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。
可见,如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的,读者想想看,为什么?
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。
相关推荐
Java 创建线程的两个方法详解及实例 Java 语言中提供了两种方式来创建线程,即通过扩展 Thread 类和实现 Runnable 接口。这两种方法都可以创建多线程程序,但是它们在实现方式和应用场景上有所不同。 扩展 Thread ...
首先,Java中创建线程主要有两种方式:通过实现Runnable接口和继承Thread类。实现Runnable接口更灵活,因为Java是单继承的,而通过继承Thread类可以直接调用start()方法启动线程。创建线程后,通过调用Thread对象的...
Java 创建线程的两种方法区别 Java 中创建线程有两种方法:继承 Thread 类和实现 Runnable 接口。这两种方法的实现机制不同,导致了不同的线程行为。本文将通过实例代码对这两种方法进行比较和分析,帮助读者更好地...
Java多线程编程中,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。这两种方式虽然都能实现多线程,但它们在实际应用中有着不同的特性和适用场景。 首先,我们来看看继承`Thread`类的方式。这种方式...
本文将深入探讨Java中的线程与协程的效果对比,以及它们各自的特点和适用场景。 线程是操作系统提供的基本执行单元,每个线程都有自己的程序计数器、系统栈和局部变量。在Java中,线程可以通过实现`Runnable`接口或...
比较创建线程的两种方法: 开发中,优先选择实现 Runnable 接口的方式的原因是: (1)实现的方式没有类的单继承的局限性 (2)实现的方式更适合来处理多个线程共享数据的情况 联系:Thread 实现了 Runnable ...
### 基于环境的Java多线程行为比较分析 #### 概述 Java的多线程机制在软件开发中占据着重要的地位,它能够显著提高应用程序的性能和响应速度,尤其是在多核处理器环境中。然而,Java多线程的行为表现会受到多种...
Java多线程中线程的两种创建方式是指在Java编程语言中创建线程的两种方法:通过实现Runnable接口创建线程和通过继承Thread类创建线程。 1. 通过实现Runnable接口创建线程 Java中每个任务就是一个可运行对象,为了...
4. **Java实现多线程的两种方式**:通过继承`Thread`类或实现`Runnable`接口来创建线程。 5. **临界区、对象锁、互斥、同步等核心概念**:这些概念是实现线程安全的基础,其中临界区是指一段不能被多个线程同时访问...
- 主函数入口,创建两个线程:`GiveLetterThread`和`InuptLetterThread`。 - `GiveLetterThread`负责周期性地给出字母,而`InuptLetterThread`负责读取用户输入的字母,并与`GiveLetterThread`给出的字母进行比较...
在这个特定的项目中,“java用多线程进行排序算法的比较”关注的是如何利用多线程技术来实现和比较不同的排序算法,尤其是快速排序。下面我们将详细探讨多线程在排序算法中的应用以及快速排序的原理。 首先,我们要...
在多线程环境中,我们可以创建多个线程并行执行任务,以提高程序的效率。Java提供了`Thread`类和`Runnable`接口来创建和管理线程。当一个线程运行时间过长,我们需要一种机制来中断它,这就是超时控制的目的。 超时...
自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`Runnable`接口相比,`Callable`接口具有以下特点: - **支持返回值**:通过`call()`方法可以返回执行...
在Java中,我们可以通过`Thread`类或`Runnable`接口来创建线程。 2. **Java中的线程创建**: - 继承`Thread`类:创建一个新的类,继承自`Thread`,重写`run()`方法,然后创建该类的实例并调用`start()`方法启动...
`SellThread`类中有两个重要的属性:`tickets`表示剩余的火车票数量,`obj`是一个`Object`实例,用于实现同步控制。 线程同步主要通过两种方式实现:同步块(synchronized block)和同步方法(synchronized method...
本篇文章将深入探讨Android(基于Java)线程的两种主要实现方式:`Thread`类和`Handler-Looper-Messenger`机制。 一、`Thread`类 `Thread`类是Java中的基础线程类,也是Android线程编程的基础。创建一个新的线程...
在这个例子中,有两个`Sequential`对象被创建并调用了它们的`run()`方法。 ```java public class SequentialDemo { public static void main(String args[]) { new Sequential("A").run(); new Sequential("B")....
标题提到的"创建线程的两种方法"指的是使用`Thread`类和实现`Runnable`接口。这两种方法都是Java中实现多线程的重要手段,各有特点和适用场景。下面我们将详细探讨这两种方法。 **1. 继承Thread类** 当一个类继承...
Java提供了两种主要的方式来创建线程,分别是继承`Thread`类和实现`Runnable`接口。这两种方式各有优缺点,适用于不同的场景。 ### 继承Thread类 当你选择继承`Thread`类来创建线程,你需要按照以下步骤操作: 1....