content: package thread;
  
  /**
   * Author: Chen zheng you
   * CreateTime: 2018-11-12 8:51
   * Description:
   * 创建线程的三种方式的对比???
   * 1. 采用实现 Runnable、Callable 接口的方式创建多线程时，线程类只是实现了 Runnable 接口或 Callable 接口，还可以继承其他类。
   * 2. 使用继承 Thread 类的方式创建多线程时，编写简单，如果需要访问当前线程，则无需使用 Thread.currentThread() 方法，直接使用 this 即可获得当前线程。
   * <p>
   * 多线程的使用???
   * 有效利用多线程的关键是理解程序是并发执行而不是串行执行的。例如：程序中有两个子系统需要并发执行，这时候就需要利用多线程编程。
   * 通过对多线程的使用，可以编写出非常高效的程序。不过请注意，如果你创建太多的线程，程序执行的效率实际上是降低了，而不是提升了。
   * 请记住，上下文的切换开销也很重要，如果你创建了太多的线程，CPU 花费在上下文的切换的时间将多于执行程序的时间！
   */
  public class RunnableDemo implements Runnable {
      private Thread t;
      private String threadName;
  
      RunnableDemo(String name) {
          threadName = name;
          System.out.println("Creating " + threadName);
      }
  
      public void run() {
          System.out.println("Running " + threadName);
          try {
              for (int i = 4; i > 0; i--) {
                  System.out.println("Thread: " + threadName + ", " + i);
                  // 让线程睡眠一会
                  Thread.sleep(50);
              }
          } catch (InterruptedException e) {
              System.out.println("Thread " + threadName + " interrupted.");
          }
          System.out.println("Thread " + threadName + " exiting.");
      }
  
      public void start() {
          System.out.println("Starting " + threadName);
          if (t == null) {
              t = new Thread(this, threadName);
              t.start();
          }
      }
  }
  
  class TestRunnableThread {
      public static void main(String args[]) {
          RunnableDemo R1 = new RunnableDemo("Thread-1");
          R1.start();
  
          RunnableDemo R2 = new RunnableDemo("Thread-2");
          R2.start();
      }
  }