java中有两种创建多线程的方法,一种为继承Thread类一种为实现Runnable接口
第一种方法
~~测试类 public class Demo01 { public static void main(String[] args) { //创建自定义线程对象 MyThread mt = new MyThread("新的线程!"); //开启新线程 mt.start(); //在主方法中执行for循环 for (int i = 0; i < 10; i++) { System.out.println("main线程!"+i); } } ~~自定义线程类 public class MyThread extends Thread { //定义指定线程名称的构造方法 public MyThread(String name) { //调用父类的String参数的构造方法,指定线程的名称 super(name); } /** * 重写run方法,完成该线程执行的逻辑 */ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(getName()+":正在执行!"+i); } }
第二种方法
//测试类 public class ThreadDemo { public static void main(String[] args) { SubRunnable sr = new SubRunnable(); //创建了线程执行对象 Thread t = new Thread(sr); //将创建的SubRunnable对象作为参数传递给Thread类的构造函数 t.start(); //开启线程 for(int i = 0 ; i < 50; i++){ System.out.println("main..."+i); } } } //自定义线程执行任务类 public class SubRunnable implements Runnable{ //实现了Runnable接口 public void run(){ //覆盖run方法 for(int i = 0 ; i < 50; i++){ System.out.println("run..."+i); } } }
用第二种方法实现Runnable接口避免了单继承的局限性,所以较为常用。实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。
所以第二种方法的好处有避免了单继承的局限性和降低了程序的耦合性