Java中Runnable和Thread的区别

    xiaoxiao2021-12-03  43

    概述

    Runnable 是接口。

    Thread 是类,且实现了Runnable接口。

    Thread部分源码

    public class Thread implements Runnable { private static class Caches { static final ConcurrentMap subclassAudits = new ConcurrentHashMap(); static final ReferenceQueue subclassAuditsQueue = new ReferenceQueue(); 在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。

    public interface Runnable { public abstract void run(); }

    Thread类,有一个构造方法:public Thread(Runnable targer)

    public Thread(Runnable runnable) { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = new Object(); init(null, runnable, (new StringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L); }

    此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。

    使用情况

    在程序开发中只要是多线程肯定永远以实现Runnable接口为主。

    实现Runnable接口相比继承Thread类有如下好处: 1、避免继承的局限,一个类可以继承多个接口。 2、适合于资源的共享。

    实例

    以卖票为例,总共只有10张动车票了,全国3个窗口在卖。

    继承Thread类的方法

    package multithreading; public class MyThreadWithExtends extends Thread { private int tickets = 10; @Override public void run() { for (int i = 0; i <= 100; i++) { if(tickets>0){ System.out.println(Thread.currentThread().getName()+"--卖出票:" + tickets--); } } } public static void main(String[] args) { MyThreadWithExtends thread1 = new MyThreadWithExtends(); MyThreadWithExtends thread2 = new MyThreadWithExtends(); MyThreadWithExtends thread3 = new MyThreadWithExtends(); thread1.start(); thread2.start(); thread3.start(); //每个线程都独立,不共享资源,每个线程都卖出了10张票,总共卖出了30张。如果真卖票,就有问题了。 } } 运行结果:

    Thread-0--卖出票:10 Thread-2--卖出票:10 Thread-1--卖出票:10 Thread-2--卖出票:9 Thread-0--卖出票:9 Thread-2--卖出票:8 Thread-1--卖出票:9 Thread-2--卖出票:7 Thread-0--卖出票:8 Thread-2--卖出票:6 Thread-2--卖出票:5 Thread-2--卖出票:4 Thread-1--卖出票:8 Thread-2--卖出票:3 Thread-0--卖出票:7 Thread-2--卖出票:2 Thread-2--卖出票:1 Thread-1--卖出票:7 Thread-0--卖出票:6 Thread-1--卖出票:6 Thread-0--卖出票:5 Thread-0--卖出票:4 Thread-1--卖出票:5 Thread-0--卖出票:3 Thread-1--卖出票:4 Thread-1--卖出票:3 Thread-1--卖出票:2 Thread-0--卖出票:2 Thread-1--卖出票:1 Thread-0--卖出票:1

    每个线程都独立,不共享资源,每个线程都卖出了10张票,总共卖出了30张。如果真卖票,就有问题了。

    实现Runnable接口方式

    package multithreading; public class MyThreadWithImplements implements Runnable { private int tickets = 10; @Override public void run() { for (int i = 0; i <= 100; i++) { if(tickets>0){ System.out.println(Thread.currentThread().getName()+"--卖出票:" + tickets--); } } } public static void main(String[] args) { MyThreadWithImplements myRunnable = new MyThreadWithImplements(); Thread thread1 = new Thread(myRunnable, "窗口一"); Thread thread2 = new Thread(myRunnable, "窗口二"); Thread thread3 = new Thread(myRunnable, "窗口三"); thread1.start(); thread2.start(); thread3.start(); } } 运行结果:

    窗口二--卖出票:10 窗口三--卖出票:9 窗口一--卖出票:8 窗口三--卖出票:6 窗口三--卖出票:4 窗口三--卖出票:3 窗口三--卖出票:2 窗口三--卖出票:1 窗口二--卖出票:7 窗口一--卖出票:5

    每个线程共享了对象myRunnable的资源,卖出的总票数是对的,但是顺序是乱的,怎么办?

    见:同步关键词synchronized

    转载请注明原文地址: https://ju.6miu.com/read-679898.html

    最新回复(0)