嗨客网搜索
Java开发环境搭建
Java方法
Java多线程创建

Thread和Runnable详解

我们可以看下 Thread 的源码,可以发现,Thread 类是实现了 Runnable 接口。

public class Thread implements Runnable { private Runnable target; ... @Override public void run() { if (target != null) { target.run(); } } ... }

我们可以看到 Thread 类实现了 Runable。它的 run 方法,是调用了 Runable 接口中的 run() 方法。从这里可以发现,我们自己定义的类实现了 Runable 接口的效果和 Thread 的效果是一样的,只不过 Thread 的类实现了更多的方法。

但是在上一篇文章中我们看到,实现了 Runable 接口的线程,还是需要依赖 Thread 来启动的。

Java Thread和Runnable接口区别

根据 Java 的语言性质,是单继承的,所以 Thread 的子类只能够有一个,而实现了 Runable 的接口可以实现其他的接口和继承其它的类。所以在使用上面,Runable 的效果比 Thread 更加灵活。

继承 Thread 线程的类是不能够将资源共享的,而实现了 Runnable 的接口的线程是可以资源共享的。具体代码效果如下:

继承Thread

package com.haicoder.net.thread; public class MyThread extends Thread { private int ticket = 5; private String name; public MyThread(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { if (ticket > 0) { System.out.println(name + "卖票 ticket = " + ticket--); } } } public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); MyThread myThreadA = new MyThread("A"); MyThread myThreadB = new MyThread("B"); MyThread myThreadC = new MyThread("C"); myThreadA.start(); myThreadB.start(); myThreadC.start(); } }

运行效果如下图:

04 Thread 资源不共享.png

实现Runnable

package com.haicoder.net.thread; public class MyRunnable implements Runnable { private int ticket = 5; private String name; public MyRunnable(String name) { this.name = name; } @Override public void run() { for(int i=0;i<100;i++){ if(ticket > 0){ System.out.println(name + "卖票,ticket = " + ticket--); } } } public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); MyRunnable myRunnable = new MyRunnable("线程A"); Thread thread1 = new Thread(myRunnable); Thread thread2 = new Thread(myRunnable); thread1.start(); thread2.start(); } }

运行效果图如下:

05 runnable 资源共享.png

Java Thread和Runnable总结

Runnable 接口相对于继承 Thread 来说,有如下显著的优势:

  1. 适合多个相同程序代码的线程去处理同一个资源的情况。
  2. 可以避免由于 Java 的单继承特性带来的局限。
  3. 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。

所以在开发过程中,建议尽量使用实现 Runnable 接口来实现多线程。

嗨客网顶部