6.2.2 启动线程: 新建1个上述类的对象s, 在新建1个类Thread的对象t, 把s作为一个参数用于t的构造方法.  并执行t.start()
  貌似比方式一复杂.
  其实非如下:
  new Thread(new M_thrd_2()).start()
  例子:
public class M_thread_expl2{
public static void g(){
M_thrd_2 s = new M_thrd_2();
s.id = 1;
Thread t1 = new Thread(s);
t1.start();
Thread t2 = new Thread(s);
s.id = 2;
t2.start();
}
}
  在g() 函数中,
  首先新建1个类M_thrd_2的 对象s.
  并利用s作为参数 建立了两个线程类Thread的对象t1 和 t2. 并启动这两个线程.
  注:
  1. 这个例子中有3个线程, 其中1个主线程(也是g() 函数所在的线程). 开启了两个子线程, 该两个子线程都在不断循环输出信息到屏幕上.
  2. Thread(object ob) 是1个属于类Thread的构造方法,  其中的对象ob 必须实现Runnable 接口.
  3. 这个例子执行时 , 第一个t1首先会输出id = 1,    但是当第二个线程t2开始执行后, t1会输出id=2,  因为t1, 和t2都是利用同1个对象建立的.
  也是说, 这个对象的变动会同时影响两个线程.
  输出如下:

  6.3 两种方式的区别
  1.  方式1是创建继承类Thread的派生类,  方式2是创建实现Runnable接口的类.
  2.  启动方式:  方式1是直接调用业务类的对象的start()方法, 方式2是利用业务类类的对象新建1个类Thread的对象, 并调用该对象的start()方法.
  3.  如果要启动多个线程, 通过方式1需要新建多个不同业务类的对象, 方式2 则可以通过业务1个对象 构建多个Thread类对象, 但是业务对象的变动会同时影响对应的多个线程.
  七. 关于线程的一些常用方法介绍.
  7.1 run()
  我们要吧线把要执行的业务代码写入这个方法. 上面提过了.  注意, 如果我们直接执行1个线程对象的run()方法可以合法的, 但是仍然是在当前线程内执行, 并没有开始一条新线程.
  7.2 Start()
  当1个线程or其派生类执行1个start()方法. 开启1个新线程, 并调用该类的run()方法.
  注意: 1个线程如果已经调用过一次start(), 再调用start()则或抛异常.
  7.3 stop()
  停止1个1个线程.
  7.4 setName() 和 getName()
  设置和获得对应线程的名字.
  7.5 Thread.currentThread()
  注意这个方法是一个static方法,  而上面的都不是静态方法.
  这个方法返回当前执行语句所属的线程.
  例如1个线程对象A.    它的run() 方法里调用了 Thread.currentThread().getName() 函数.
  假如直接执行A.run()  则返回的是当前线程(而不是A线程) 的名字,  因为对象A并没有启动自己的线程.
  假如执行难过A.start(), 那么该函数返回A启动的线程的名字了.
  八, 小结
  这篇文章只是简介, 很多重要的方法例如 sleep() , wait() 等都没有介绍, 这些是线程控制的内容. 本吊打算在另一篇博文里介绍.