多线程的创建方式

Java多线程有两种实现方式:
1.继承Thread类
2.实现Runnable接口
【匿名内部类】
实现Runnable接口的好处:

  • 避免了单线程局限性:单继承多实现。
  • 增强了程序的扩展性,降低了程序的耦合性(解耦):实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)。实现类中,重写了run()方法,用来设置线程任务。创建Thread类对象,调用start()方法:用来开启新线程。

1.继承Thread类

实现步骤:
a.创建一个类,继承Therad类。
b.重写run()方法,在方法中设置线程任务。
c.在主方法中创建Thread子类对象。
d.使用该子类对象调用Therad类中的start()方法。【注意:线程开启的位置】

//主类
public class Test{
	public static void main(String... args){
		//注意开启新线程的位置(第一次写在了for循环下面)
		//3.创建子类对象
		Thread1 t1 = new Thread1();
		t1.start();//使用子类对象调用Thread类的start()方法,开启新线程

		for(int i = 0; i < 20; i++){
			System.out.println("main:"+i);
		}
	}
}
//1.创建一个新线程类,继承Thread类
public class Thread1 extends Thread{
	//2.重写run()方法,设置线程任务
	@Override
	public void run(){
		for(int i = 0; i < 20; i++){
			System.out.println("thread1>>>>>>>>>>"+i);
		}
	}
}

执行结果:
在这里插入图片描述
2.实现Runnable接口

实现步骤:
1.创建一个类,实现Runnable接口,并重写run()方法,设置线程任务;
2.创建实现类对象;
3.创建Thread类对象,同时将实现类对象传入Thread类的构造方法中;
4.调用Thread类对象的start()方法,开启新线程执行run()方法。

//1.创建一个类,实现Runnable接口
public class ImplementRunnable implements Runnable{
	//并重写run()方法,设置线程任务
	@Override
	public void run(){
		for(int i = 0; i < 20; i++){
			System.out.println(Thread.currentThread().getName()+"--->"+i);
		}
	}
}
public class Test{
	public static void main(String[] args){
		// 2.创建实现类对象
		ImplementRunnable ir = new ImplementRunnable();
		//3.创建Thread类对象,同时将实现类对象传入Thread类的构造方法中;
		Thread t = new Thread(ir);
		//4.调用Thread类对象的start()方法,开启新线程执行run()方法。
		t.start();
		
		for(int i = 0; i < 20; i++){
			System.out.println(Thread.currentThread().getName()+"--->"+i);
		}
	}
}

执行结果:
在这里插入图片描述
3.匿名内部类

匿名:没有名字; 内部类:写在其他类内部的类; 作用:简化代码。
       把子类继承父类、重写父类的方法,创建子类对象合成一步完成。
       把实现类、实现类接口、重写接口中的方法、创建实现类对象合成一步完成。

格式:
new 父类/接口(){
           //重写父类或接口中的run方法;
};

public class AnonymousInnerClassThread{
	/*第一次把匿名内部类写成了成员
	在main方法只创建了该类对象,导致编译报错
	(可能是在编译的时候就开始调用start方法原因,
	但是把内部类写在main方法中编译就不会报错)*/
	//第一种:使用Thread类
	//new Thread(){run()}.start();
	public void t(){
		new Thread(){
		@Override
		public void run(){
			for(int i = 0; i < 10; i++){
				System.out.println(Thread.currentThread().getName()+"--->"+i);
			}
		}
	}.start();
	//第二种:使用Runnable接口
	/*
	回想一下实现Runnable接口的步骤:
	1.创建一个类实现Runnable接口,重写接口的run()方法;
	2.创建实现类对象;
	3.创建Thread类对象,同时在该类的构造方法中传入实现类对象;
	4.调用start()方法,执行run()方法。
	
	所以,使用Runnable接口实现匿名内部类的步骤为:
	1.创建Runnable接口对象,重写run()方法;
	2.创建Thread类对象,同时在该类的构造方法中传入Runnable接口对象;
	3.调用Thread类对象的start()方法,执行run()方法。
	*/
	
	//1.创建Runnable接口对象,重写run()方法
	Runnable r = new Runnable(){
		@Override
		public void run(){
			for(int i = 0; i < 10; i++){
				System.out.println(Thread.currentThread().getName()+"--->"+i);
			}
		}
	};
	//2.创建Thread类对象,同时在该类的构造方法中传入Runnable接口对象
	//3.调用start()方法
	new Thread(r).start();

	//使用Runnable接口的简写方法
	//new Thread(new Runnable(){}).start();
	new Thread(new Runnable(){
		@Override
		public void run(){
			for(int i = 0; i < 10; i++){
				System.out.println(Thread.currentThread().getName()+"--->"+i);
			}
		}
	}).start();
	}
}
public class Test{
	public static void main(String... args){
		//Thread1 t1 = new Thread1();
		//t1.start();
		
		//ImplementRunnable ir = new ImplementRunnable();
		//Thread t = new Thread(ir);
		//t.start();
		
		AnonymousInnerClassThread   act = new AnonymousInnerClassThread();
		act.t();
		
		for(int i = 0; i < 20; i++){
			System.out.println(Thread.currentThread().getName()+"--->"+i);
		}
	}
}

执行结果:
在这里插入图片描述
多线程详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值