`
liumayulingyan
  • 浏览: 155406 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA多线程--Runnable和Thread的区别

 
阅读更多
转载:http://blog.csdn.net/wwww1988600/article/details/7309070
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限,
  下面看例子:
  package org.thread.demo;
  class MyThread extends Thread{
  private String name;
  public MyThread(String name) {
  super();
  this.name = name;
  }
  public void run(){
  for(int i=0;i<10;i++){
  System.out.println("线程开始:"+this.name+",i="+i);
  }
  }
  }
  package org.thread.demo;
  public class ThreadDemo01 {
  public static void main(String[] args) {
  MyThread mt1=new MyThread("线程a");
  MyThread mt2=new MyThread("线程b");
  mt1.run();
  mt2.run();
  }
  }
  但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动
  start()方法启动线程:
  package org.thread.demo;
  public class ThreadDemo01 {
  public static void main(String[] args) {
  MyThread mt1=new MyThread("线程a");
  MyThread mt2=new MyThread("线程b");
  mt1.start();
  mt2.start();
  }
  };这样程序可以正常完成交互式运行。那么为啥非要使用start();方法启动多线程呢?
  在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了private native void start0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface)
  ·Runnable接口
  在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。
  public interface Runnable{
  public void run();
  }
  例子:
  package org.runnable.demo;
  class MyThread implements Runnable{
  private String name;
  public MyThread(String name) {
  this.name = name;
  }
  public void run(){
  for(int i=0;i<100;i++){
  System.out.println("线程开始:"+this.name+",i="+i);
  }
  }
  };

  但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable targer)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。(start()可以协调系统的资源):
  package org.runnable.demo;
  import org.runnable.demo.MyThread;
  public class ThreadDemo01 {
  public static void main(String[] args) {
  MyThread mt1=new MyThread("线程a");
  MyThread mt2=new MyThread("线程b");
  new Thread(mt1).start();
  new Thread(mt2).start();
  }
  }
  · 两种实现方式的区别和联系:
  在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比
  继承Thread类有如下好处:
  ->避免点继承的局限,一个类可以继承多个接口。
  ->适合于资源的共享
  以卖票程序为例,通过Thread类完成:
  package org.demo.dff;
  class MyThread extends Thread{
  private int ticket=10;
  public void run(){
  for(int i=0;i<20;i++){
  if(this.ticket>0){
  System.out.println("卖票:ticket"+this.ticket--);
  }
  }
  }
  };
  下面通过三个线程对象,同时卖票:
  package org.demo.dff;
  public class ThreadTicket {
  public static void main(String[] args) {
  MyThread mt1=new MyThread();
  MyThread mt2=new MyThread();
  MyThread mt3=new MyThread();
  mt1.start();//每个线程都各卖了10张,共卖了30张票
  mt2.start();//但实际只有10张票,每个线程都卖自己的票
  mt3.start();//没有达到资源共享
  }
  }
  如果用Runnable就可以实现资源共享,下面看例子:
  package org.demo.runnable;
  class MyThread implements Runnable{
  private int ticket=10;
  public void run(){
  for(int i=0;i<20;i++){
  if(this.ticket>0){
  System.out.println("卖票:ticket"+this.ticket--);
  }
  }
  }
  }
  package org.demo.runnable;
  public class RunnableTicket {
  public static void main(String[] args) {
  MyThread mt=new MyThread();
  new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一
  new Thread(mt).start();//个实例化对象mt,就会出现异常
  new Thread(mt).start();
  }
  };
  虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。
  Runnable接口和Thread之间的联系:
  public class Thread extends Object implements Runnable
  发现Thread类也是Runnable接口的子类。
分享到:
评论

相关推荐

    Java多线程-Socket编程

    在 Java 中,多线程可以使用 Thread 类和 Runnable 接口来实现,而 Socket 编程则需要使用 java.net 包中的相关类来实现。 在 Java 多线程-Socket 编程中,客户端和服务器端都需要使用 Socket 来进行通信。客户端...

    Java多线程-创建多线程的基本方式二:实现Runnable接口

    总结,实现`Runnable`接口是创建Java多线程的一种常见方式,它提供了更大的灵活性,尤其是在需要多继承或者线程之间需要共享数据的情况下。掌握这两种创建线程的方法,并了解其适用场景,对于编写高效的并发程序至关...

    Java多线程-创建多线程的基本方式一:继承Thread类

    【Java多线程-创建多线程的基本方式一:继承Thread类】 在Java编程中,多线程是一种并发执行任务的机制,它允许多个任务在同一时间运行,从而提高程序的效率和响应速度。Java提供了多种创建多线程的方式,其中最...

    Java多线程--等待所有子线程执行完的五种方法.docx

    在Java多线程编程中,有时我们需要确保所有子线程执行完毕后再进行后续操作,例如在并发测试、数据聚合或资源清理等场景。本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`...

    Java多线程-Thread类的常用结构及线程优先级

    Java多线程编程是开发高并发应用的基础,其中Thread类是实现多线程的核心类。本文将详细解析Thread类的常用结构以及线程优先级。 一、Thread类的常用结构 1. 线程中的构造器 - `Thread()`:创建一个没有指定名称...

    Java多线程-多线程知识点总结和企业真题

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    Java多线程-多线程相关概念

    Java多线程技术是编程中不可或缺的一部分,它允许程序在同一时间执行多个任务,从而提高效率和响应速度。本文将深入探讨多线程相关的概念。 首先,我们要了解程序、进程和线程的区别。程序是一组指令的集合,静态...

    Java多线程-线程的安全问题与线程的同步机制介绍

    Java多线程-线程的安全问题与线程的同步机制介绍 在 Java 多线程编程中,线程安全问题是非常重要的一个话题。当多个线程访问同一个资源时,如果只有读操作那么不会出现线程安全问题,但是如果多个线程对资源进行读...

    多线程的Runnable_和thread有什么区别

    ### 多线程的Runnable与Thread的区别 在Java中实现多线程有两种主要方式:一种是继承`Thread`类;另一种是实现`Runnable`接口。本文将深入探讨这两种方法的区别,帮助初学者更好地理解并选择适合场景的多线程实现...

    Java多线程-对比创建多线程的两种方式

    Java多线程编程中,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。这两种方式虽然都能实现多线程,但它们在实际应用中有着不同的特性和适用场景。 首先,我们来看看继承`Thread`类的方式。这种方式...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    java多线程Runnable实例

    `Runnable`接口是Java实现多线程的一种方式,通过实现`Runnable`接口并创建`Thread`对象,可以轻松地创建并运行多线程。`TestRunnable.java`文件展示了这一过程,同时也提醒我们在实际开发中要注意线程同步和通信,...

    Java多线程-线程间的通信

    ### Java多线程—线程间的通信 #### 一、线程间的通信 ##### (1)为什么要处理线程间的通信? 在多线程环境中,不同的线程可能需要协同工作来完成一项任务。例如,一个线程负责生产数据,另一个线程负责消费这些...

    Java多线程技术 线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口

    ### Java多线程技术详解 #### 一、引言 多线程编程是现代软件开发中不可或缺的一部分,尤其是在Java这样的面向对象编程语言中尤为重要。Java提供了丰富的API支持多线程编程,使得开发者能够轻松地创建复杂的并发...

    java-Thread-study-summary.zip_java 多线程

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,实现多线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。本资料“java-Thread-study-summary.zip”...

    java基础--11.多线程-1

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。本节我们将深入探讨Java中的多线程概念,包括其重要性、创建方法以及相关机制。 一、多线程的重要性 1....

    WHUT-java多线程实验-第三周-文件上传和下载.zip

    在“WHUT-java多线程实验-第三周-文件上传和下载.zip”这个实验中,我们将重点探讨如何在多线程环境中实现文件的上传和下载功能。这个实验基于IntelliJ IDEA开发环境,它是一个流行的Java集成开发环境,提供了丰富的...

    Java多线程-JDK5.0新增线程创建方式

    ### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...

    Java多线程-线程的生命周期

    Java多线程中,线程的生命周期是编程中必须理解的重要概念。在JDK1.5之前,线程被划分为五个状态,分别是新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。在JDK1.5及之后,线程的...

Global site tag (gtag.js) - Google Analytics