Thread 和 Runnable 关系
Thread 类是接口 Runnable 的一个实现类.
public class Thread implements Runnable
源码分析
Thread Threa 类运行的时候调用 start() 方法, 源代码如下:
调用 start() 方法, 实际运行的是 start0 方法, 方法声明如下:
private native void start0()
native 表明这个方法是个原生函数, 即这个函数是用 C/C++ 实现的, 被编译成 DLL, 由 Java 调用. native 方法是在注册是在 Thread 对象初始化完成的, 如图, 静态块 static 里有个 registerNatives 方法, 该方法会注册一些本地方法供 Thread 类使用.
start0 方法会在 JVM 新建一个线程
Runnable Runnable 接口只有一个 run() 方法, 完全是线程运行规范.
代码实例分析
Thread 类定义一个卖票的类
- public class TicketThread extends Thread {
- private int ticket = 100000;
- @Override
- public void run() {
- for (int i = 0; i <100000; i++) {
- if (ticket> 0) {
- System.out.println("ticket=" + ticket-- + "," + Thread.currentThread().getName());
- }
- }
- }
- }
启动三个线程
- new TicketThread().start();
- new TicketThread().start();
- new TicketThread().start();
运行发展每个线程独立执行了卖票的任务, 每个线程中票数依次减 1.
Runnable 接口实现一个卖票的类
- public class TicketRunnableThread implements Runnable {
- private int ticket = 1000;
- public void run() {
- for (int i = 0; i <1000; i++) {
- if (ticket> 0) {
- System.out.println("ticket=" + ticket-- + "," + Thread.currentThread().getName());
- }
- }
- }
- }
启动三个线程
- TicketRunnableThread ticketRunnableThread = new TicketRunnableThread();
- new Thread(ticketRunnableThread).start();
- new Thread(ticketRunnableThread).start();
- new Thread(ticketRunnableThread).start();
三个线程共同完成了卖票任务, 然而三个线程共同执行同一段代码, 会造成线程不安全, 可以通过加锁解决.
使用选择
实现 Runnable 接口的同时, 还可以继承其他类, 避免 Java 的单继承性带来局限性.
Runnable 接口可以实现资源共享, Thread 无法完成资源共享.
来源: https://juejin.im/post/5c91fbf36fb9a07100165365