疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

更好的理解Java多线程


 

   

  1.线程的创建

  之前知道Java中一个多线程的创建方法是继承Thread类或者实现Runable接口,但是看不懂下面这种创建线程的方法

  第一种

  new Thread(new Runnable() {

  @Override

  public void run() {

  }

  }

  }).start();//这种方式中new Thread()是创建了一个线程,而new Runable()对象中是线程想要执行的代码,这样把想要执行的代码放到一个创建的对象中,所

   //以很好的体现了面向对象的编程规则。

  或者下面这种创建格式

  第二种

  new Thread(){

  @Override

  public void run() {

  // TODO Auto-generated method stub

  super.run();

  }

  }.start();

  其实两种方法昨天看了一段是视频现在理解了,其实第一种方法就是面向对象的思维模式去创建一个线程,在Thread的源码中,一种是通过构造方法传递一个Runable对象然后为target赋值,然后去实现一个线程的创建,也就是上面的第一种创建方法,一种是直接重写run方法,也就是上面的第二种方法创建线程,但是网上通常是使用第一种方法的比较多?那是为什么呢?是因为第一种通过构造方法的方式创建线程更能体现面向的规则,new Thread()是创建了一个对象,这个对象想要执行的代码就写在了括号里面,这样就很好的体现了面向对象的编程方式。

  那我们想一下,下面这种创建对象的方式是会执行Runable中的run方法还是执行thread的run方法呢?

  new Thread(

  new Runnable() {

  public void run() {

  while (true) {

  try {

  Thread.sleep(500);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  System.out.println("runable" + Thread.currentThread().getName());

  }

  }

  }

  ) {

  @Override

  public void run() {

  while (true) {

  try {

  Thread.sleep(500);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  System.out.println("thread" + Thread.currentThread().getName());

  }

  }

  }.start();

  new Thread(new Runable(){}){}.start();答案是执行thread中的run方法(即是子类中的run方法),为什么呢?因为创建一个new thread的时候重写了父类中的run()方法,那么就会直接执行thread中的run方法了,如果这个子类中的run方法不存在的情况下才会去执行父类中的run方法。