其他分享
首页 > 其他分享> > 第八章 多线程 3 - 创建多线程的两种方式

第八章 多线程 3 - 创建多线程的两种方式

作者:互联网

创建多线程的两种方式
方式一:继承Thread类的方式

  1. 创建一个继承Thread类的子类
  2. 重写Thread类中的run() --> 将执行代码逻辑声明在run()中
  3. 创建Thread类的子类对象
  4. 通过此对象调用start(): ① 启动当前线程 ② 调用当前线程的run()

【代码】

public class ThreadDemo {
 
  public static void main(String[] args) {
      //设置线程名字,不设置则使用默认构造 0 1 2 3...这样
      Thread.currentThread().setName("主线程");
      MyThread myThread = new MyThread();
      myThread.setName("子线程:");
      //开启线程
      myThread.start();
      for(int i = 0;i<5;i++){
          System.out.println(Thread.currentThread().getName() + i);
      }
  }
}
 
//实现方式之继承Thread
class MyThread extends Thread{
  //重写run()方法
  public void run(){
      for(int i = 0;i < 5; i++){
          System.out.println(Thread.currentThread().getName() + i);
      }
  }
}
 
//注意:由执行结果可以看出,并非按照顺序,而是通过抢占cpu资源,抢到则执行。

执行结果:

main thread0
子线程:0
子线程:1
子线程:2
main thread1
子线程:3
main thread2
子线程:4
main thread3
main thread4

说明两个问题:

问题一:我们启动一个线程,必须要调用start(),不能调用run()的方式启动线程
问题二:如果再启动一个线程,必须重新创建一个Thread子类的对象,调用此对象的start()

方式二:实现Runnable接口的方式

  1. 创建一个实现了Runnable接口的类
  2. 实现类去实现Runnable中的抽象方法:run()
  3. 创建实现类的对象
  4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
  5. 通过Thread类的对象调用start()

【代码】

public class RunnableDemo {
	
	 public static void main(String[] args) {
	      //设置线程名字,不设置则使用默认构造 0 1 2 3...这样
	      Thread.currentThread().setName("主线程");
	      Thread myThread = new Thread(new MyRunnable());//作为参数传入
	      myThread.setName("实现Runnable接口方式,子线程:");
	      //开启线程
	      myThread.start();
	      for(int i = 0;i<5;i++){
	          System.out.println(Thread.currentThread().getName() + i);
	      }
	  }
	}
 
	//实现方式之实现Runnable
	class MyRunnable implements Runnable{
	  //重写run()方法
	  public void run(){
	      for(int i = 0;i < 5; i++){
	          System.out.println(Thread.currentThread().getName() + i);
	      }
	  }
	}

执行结果:

主线程0
实现Runnable接口方式,子线程:0
实现Runnable接口方式,子线程:1
实现Runnable接口方式,子线程:2
主线程1
实现Runnable接口方式,子线程:3
实现Runnable接口方式,子线程:4
主线程2
主线程3
主线程4

两种方法的对比:
开发中:

优先选择:实现Runnable接口的方式

原因:

  1. 实现的方式没有类的单继承性的局限性
  2. 实现方式更加适合来处理多线程共享数据的情况。

联系:public class Thread implements Runnable
相同点:

两个方式都需要重写run(),将线程要执行的逻辑代码声明在run()中。
目前两种方式,要想启动线程,都是调用的Thread类中的start().

标签:main,Runnable,run,Thread,创建,第八章,start,线程,多线程
来源: https://www.cnblogs.com/anjiaxiaopihai/p/16372520.html