【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类
转自: http://blog.csdn.net/sunguangran/article/details/6069317
非常感谢原作者,整理的这么详细。
在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中线程的两种实现方法-实现Runnable接口和继承Thread类的更多相关文章
- java中线程分两种,守护线程和用户线程。
		
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
 - 线程入门之实现Runnable接口和继承Thread类
		
线程的2种使用方式:实现Runnable接口和继承Thread类 1.实现Runnable接口 实现Runnable接口,必须实现run方法,也是Runnable接口中的唯一一个方法 class Ru ...
 - Java创建线程的两种方法
		
大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 ...
 - java创建线程的两种方式及源码解析
		
创建线程的方式有很多种,下面我们就最基本的两种方式进行说明.主要先介绍使用方式,再从源码角度进行解析. 继承Thread类的方式 实现Runnable接口的方式 这两种方式是最基本的创建线程的方式,其 ...
 - java中创建多线程两种方式以及实现接口的优点
		
多线程创建方式有两种 创建线程的第一种方式.继承Thread类 1.继承Thread类 2.重写Thread类中的run方法--目的将自定义代码存储在run方法.让线程执行3.调用线程的start() ...
 - Java新建线程的两种方式
		
Java新建线程有两种方式,一种是通过继承Thread类,一种是实现Runnable接口,下面是新建线程的两种方式. 我们假设有个竞赛,有一个选手A做俯卧撑,一个选手B做仰卧起坐.分别为两个线程: p ...
 - Java创建线程的第二种方式:实现runable接口
		
/*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法 将线程要运行的代码存放在 ...
 - java中线程的几种状态和停止线程的方法
		
1.线程的状态图 需要注意的是:线程调用start方法是使得线程到达就绪状态而不是运行状态 2.停止线程的两种方法 1)自然停止:线程体自然执行完毕 2)外部干涉:通过线程体标识 1.线程类中定义线程 ...
 - java中线程的三种实现方式
		
一下记录下线程的3中实现方式:Thread,Runnable,Callable 不需要返回值时,建议使用Runnable:有返回值时建议使用Callable 代码如下所示: package com.f ...
 
随机推荐
- java 序列化的作用
			
public class Test { public static String requestUrl = "http://localhost/SpringMvc/test.do" ...
 - (转)免费天气预报接口API以及全国所有地区代码!!
			
国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data ...
 - <2013 12 17> 专业技能
			
Specialties: • Mechanical design modeling using Pro/ENGINEER and SolidWorks.• Robot control, path pl ...
 - C# 自定义控件摘记
			
C# 自定义控件属性 现有自定义控件,内有一textbox控件 TextBox1.控件有一属性 Value 定义为 [BrowsableAttribute(true)] [BindableAttrib ...
 - ajax异步请求分页显示
			
html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
 - Django 之 权限系统(组件)
			
参考: http://www.cnblogs.com/yuanchenqi/articles/7609586.html
 - 001-Spring在代码中获取bean的几种方式
			
一.概述 方法一:在初始化时保存ApplicationContext对象 方法二:通过Spring提供的utils类获取ApplicationContext对象 方法三:继承自抽象类Applicati ...
 - Google Cloud Platfrom中使用Linux VM
			
Linkes https://cloud.google.com/compute/docs/quickstart-linuxhttps://console.cloud.google.com/comput ...
 - sublime text - vintage
			
使用sublime text的vim模式的同学注意了: { "color_scheme": "Packages/Color Scheme - Default/Mac Cl ...
 - 前端之HTML基础
			
一.初识HTML 1.web服务的本质 方式一:服务端 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SO ...