多线程-创建线程第二种方式-实现Runnable接口-细节和好处
1 package multithread2; 2 3 /* 4 * 创建线程的第一种方法:继承Thread类 5 * 6 * 创建线程的第二种方式:实现Runnable接口 7 * 8 * 1,定义类实现Runnable接口。 9 * 2,覆盖接口中的run方法,将线程的任务代码封装到run方法中。 10 * 3,通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。 11 * 为什么?因为线程的任务都封装在Runnable接口子类对象的run方法中。 12 * 所以要在线程对象创建时就必须明确要运行的任务。 13 * 4,调用线程对象的start方法开启线程 14 * 15 * 16 * Runnable出现仅仅是将线程的任务进行对象的封装 17 * 18 * 实现Runnable接口的好处: 19 * 1,将线程的任务从线程的子类中分离出来,进行了单独的封装。 20 * 按照面向对象的思想将任务的封装成对象。 21 * 2,避免了java单继承的局限性。 22 * 23 * 所以,创建线程的第二种方式较为常用 24 * 25 */ 26 27 28 class Demo implements Runnable {//extends Fu {//如果自己本身有父类怎么解决实现run方法呢?准备扩展Demo类的功能,让其中的内容可以作为线程的任务 29 //通过接口的形式完成 30 31 public void run() { 32 show(); 33 } 34 public void show() { 35 for (int x = 0; x < 20; x++) { 36 System.out.println(Thread.currentThread().getName()+"...."+x); 37 } 38 } 39 } 40 public class ThreadDemo { 41 42 public static void main(String[] args) { 43 // TODO Auto-generated method stub 44 Demo d = new Demo(); 45 Thread t1 = new Thread(d); 46 Thread t2 = new Thread(d); 47 t1.start(); 48 t2.start(); 49 // Demo d1 = new Demo(); 50 // Demo d2 = new Demo(); 51 // d1.start(); 52 // d2.start(); 53 } 54 55 } 56 57 58 class Thread{ 59 private Runnable r; 60 Thread(){ 61 62 } 63 Thread(Runnable r){ 64 this.r = r; 65 } 66 public void run() { 67 if (r!=null) { 68 r.run(); 69 } 70 71 } 72 public void start() { 73 run(); 74 } 75 } 76 77 78 class ThreadImpl implements Runnable{ 79 public void run() { 80 System.out.println("runnable run"); 81 } 82 83 } 84 ThreadImpl i = new ThreadImpl(); 85 Thread t = new Thread(i); 86 t.start(); 87 88 /* 89 class SubThread extends Thread{ 90 public void run() { 91 System.out.println("haha"); 92 } 93 } 94 SubThread s = new SubThread(); 95 s.start(); 96 */