多线程——Thread与Runnable的区别

首先,从使用形式上,使用Runnable实现多线程更好,因为避免了单继承问题,但除了这一点之外,Thread和Runnable之间也存在一些联系。观察Thread类的定义形式:

public class Threadextends Objectimplements Runnable

原来Thread类是Runnable接口的子类,那么Thread类也应该覆写了run()方法。

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}

private void init有this.target = target;

而之前target的定义是: private Runnable target;

可以形成如下的类继承结构:

所以,在多线程的处理上使用的是代理设计模式。除了上面的关系,在实际开发中使用Runnable还有一个特点:使用Runnable实现的多线程的程序类可以更好的描述出数据共享的概念(并不是说Thread不能)。
(目标是产生若干个线程进行同一数据的处理操作)
范例:使用Thread实现数据操作
class MyThread extends Thread{   //是一个线程的主体类
    private int ticket=10;//一共10张票

    @Override
    public void run() {
        for(int x=0;x<20;x++){
            if(this.ticket>0){
                System.out.println("卖票,ticket="+this.ticket--);
            }
        }
    }
}
public class ThreadTest {
    public static void main(String[] args) {
        new MyThread().start();
        new MyThread().start();
        new MyThread().start();
    }
}

此时只是想启动三个线程进行卖票处理。结果变为了各自卖各自的三张票。没有实现共享。分析内存关系:是各自自己的

改为:
class MyThread extends Thread{   //是一个线程的主体类
    private int ticket=10;//一共10张票

    @Override
    public void run() {
        for(int x=0;x<20;x++){
            if(this.ticket>0){
                System.out.println("卖票,ticket="+this.ticket--);
            }
        }
    }
}
public class ThreadTest {
    public static void main(String[] args) {

        MyThread mt=new MyThread();
        new Thread(mt).start();
        new Thread(mt).start();
        new Thread(mt).start();
               //即new Thread(new MyThread()).start();
    }
}

输出结果是:只有10张票,是实现了数据共享。但是相当有两个人都有水,但是这个人非要喝另外一个人的水,并不好。

范例:使用Runnable实现共享

class MyThread implements Runnable{   //是一个线程的主体类
    private int ticket=10;//一共10张票

    @Override
    public void run() {
        for(int x=0;x<20;x++){
            if(this.ticket>0){
                System.out.println("卖票,ticket="+this.ticket--);
            }
        }
    }
}
public class ThreadTest {
    public static void main(String[] args) {
        MyThread mt=new MyThread();
        new Thread(mt).start();
        new Thread(mt).start();
        new Thread(mt).start();
    }
}

这时的MyThread是没有start方法的,所以是可以使用Thread的start方法的。实现了数据共享。输出结果也是共同卖10张票。

Runnable能比Thread更好的实现数据共享的功能,但不是能不能的区别。又因为Runnable用的多,所以就能实现好的实现数据共享的。

时间: 2024-10-12 23:54:47

多线程——Thread与Runnable的区别的相关文章

Thread 和Runnable的区别

Thread 和Runnable 的区别 Thread类 在java中可有两种方法实现度线程,一种是继承Thread类,一种是实现Runnable接口.Thread类是在java.lang包中定义的.一个类只要继承了Thread类,并覆写了本类的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这就是此方法的局限性. 但是,此时结果很有规律,先是第一个对象执行,然后第二个对象执行,并没有相互运行.在JDK的文档中可以发现,一旦调用start()方法.下面启动start()方法启动

java线程-Thread和Runnable的区别

进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小. 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行 在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. Thread类是在java.lang包

并发编程之多线程基础-Thread和Runnable的区别及联系(二)

上篇文章讲述了创建线程的常用方式 本篇主要分析一下Thread和Runnable两种方式创建线程的区别及联系 联系: ?Thread类实现了Runable接口. ?都需要重写里面Run方法. 区别: ?Thread方式不支持多继承,Runnable方式支持多个实现 ?Runnable更容易实现资源共享,能多个线程同时处理一个资源. 疑惑分享: 本人在理解他们区别的时候 考虑到Thread类本身就是Runnable的实现类 所以产生了一个疑惑:- 为什么Runnable可以实现共享而Thread却

多线程-Thread、Runnable、Callbale、Future

Thread:java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类,可以通过继承Thread类来创建并启动多线程. package org.github.lujiango; public class Test10 { static class MyThread extends Thread { @Override public void run() { System.out.println("I am extend Thread..."); } } publi

JAVA多线程Thread VS Runnable详解

要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件 进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立.所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位.线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源.所以线程是轻量级的

2018-08-25多线程Thread类+Runnable接口+线程的6种状态

多线程: 进程:进程指正在运行的程序:确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能(进入内存运行的程序成为进程)! 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程!一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序(线程是执行单元,一个进程可以包括多个线程,一个程序可以有多个进程)! 单线程程序:若有多个任务只能依次执行(这个任务执行完毕,下一个任务开始执行)!如:去网吧上网,网吧只能让一

多线程-Thread,Runnable,Callable,Future,RunnableFuture,FutureTask

类图: 先看各自的源码: public interface Runnable { public abstract void run(); } public class Thread implements Runnable { /* What will be run. */ private Runnable target; } Thread与Runnable其实是一个装饰器模式. public interface Callable<V> { V call() throws Exception;

多线程-Thread与Runnable源码分析

Runnable: @FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be call

JAVA基础(多线程Thread和Runnable的使用区别(转载)

转自:http://jinguo.iteye.com/blog/286772 Runnable是Thread的接口,在大多数情况下“推荐用接口的方式”生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承. 在使用Thread的时候只需要new一个实例出来,调用start()方法即可以启动一个线程. Thread Test = new Thread(); Test.start(); 在使用Runnable的时候需要先new一个继承Runnable的实例,之后用子类T