Java多线程笔记

多线程的基本实现方式(持续更新)

1、继承Thread类

使用步骤如下:

  1. 创建一个自己需要的线程类MyThread,使其继承Thread类
  2. 在MyThread类中覆写Thread类的run方法(run方法定义的是多线程要执行的业务)
  3. 使用从Thread继承来的start()方法启动多线程

代码实例如下:

// 第一步:创建
 class MyThread extends Thread {
	private String title;
	public MyThread(String title){
		this.title = title;
		} 
	
	// 第二步:覆写
	@Override
	public void run(){
	.../*执行业务*/
	}
}

public static void main(String[] args){
	// 第三步:用start()启动
	new MyThread("线程1").start();
	new MyThread("线程2").start();
	new MyThread("线程3").start();

缺点:
Java支持类的多层继承,不支持类的多重继承,所以存在单继承局限。

2、 实现Runnable接口

实现Runnable接口的代码示例如下:
代码实例如下:

// 第一步:创建
 class MyThread implements Runnable {
	private String title;
	public MyThread(String title){
		this.title = title;
		} 
	
	// 第二步:覆写
	@Override
	public void run(){
	.../*执行业务*/
	}
}

实现Runnable接口和继承Thread类没有区别,区别在于主程序如何创建线程实例。
start()方法时由Thread类提供的,我们需要用start()启动线程,所以在创建实例时需要用Thread类对其进行封装。

public static void main(String[] args){

	// 第三步:用start()启动
	Thread threadA = new Thread(new MyThread("线程1"));
	Thread threadB = new Thread(new MyThread("线程2"));
	Thread threadC = new Thread(new MyThread("线程3"));
	threadA.start();
	threadB.start();
	threadC.start();

优点:
Java虽不支持类的多重继承,但支持接口的“多重实现”,即一个实现类可以实现多个接口以完成更复合的功能,弥补了第一种方法的缺点

小tips

Thread类与Runnable接口的关系

源自Java源码
可以从源码中看到,Thread也是Runnable接口的实现类
所以,继承Thread并覆写run方法,实际上是在覆写Runnable接口的run方法

为什么要用start()方法启动,而不是直接调用run()方法

因为查看Thread源码可以发现,start()方法里还会调用一个叫start0()的方法
start()源码
native关键字是指Java本地接口调用(Java Native Interface),即 使用Java调用本机操作系统的函数功能完成一些特殊操作,而这样的代码开发在Java中很少出现。
start0方法类似于抽象方法,没有方法体,而是交给JVM(匹配不同的操作系统)实现。

实例化
调用
调用
委托
windows下的调度算法
Linux下的调度算法
Unix下的调度算法
Java主程序
MyThread
start方法
start0方法
JVM
CPU资源 内存资源 IO资源

为什么实现了Runnable还是需要用Thread封装呢?

Runnable源码
可以从源码看到,Runnable接口只提供run()方法。
Thread构造方法
Thread的构造方法可以以Runnable的实现类作为参数,所以可以用上文方法来实现Runnable的多线程。

最后整理一下逻辑

    Java设计了Runnable接口,并用Thread类实现了这个接口。
    在Thread类中定义了start()方法用来启动线程,所以可以写一个Thread的继承类并将其实例化,再用实例调用start()方法。
但由于Java存在单继承局限,而实现接口则允许“多重实现”,所以我们可以改用实现Runnable接口的方法创建线程(可以同时实现其他接口完成其他业务)。
    又因为我们需要用到start()方法来启动线程,而start()方法只存在于Thread类中,于是我们注意到Thread类提供了一种以Runnable对象为参数的构造方法,所以我们只需写好Runnable的实现类,然后用Thread封装起来,便既可以启动多线程,又可以兼顾其他业务。

  • 51
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值