二、多线程的实现

多线程实现的三种方式:

1、继承Thread类

是一个支持多线程的功能类,只要一个子类继承就可以实现多线程。在对Thread类进行深入理解之前,我们必须要知道:所有程序的起点是 main() 方法,所有线程也应该有自己的起点,这个起点就是 run() 方法。在多线程的每个主体类中都必须覆写Thread类中所提供的run()方法。
在这里插入图片描述
细心点可以发现,Thread类中的 public void run() 方法没有返回值,即线程一旦开始运行就要一直进行下去,不返回内容。

看个例子:

在这里插入图片描述
此程序正常运行,但线程和进程是一样的,当出现多个线程时,就要轮流抢占资源,即多个线程要交替运行(启动多线程的标志)。此程序直接调用run()方法,并不能启动多线程。而启动多线程唯一的方法是 Thread类 中的 start() 方法。
注:调用public void start()执行的方法体是run()定义的。
在这里插入图片描述
在这里插入图片描述

那为什么启动多线程用start()而不是run()呢?

在这里插入图片描述
通过start()方法的源码可以发现,其中有重复启动线程判断(抛出 IllegalThreadStateException() 异常),之后调用start0() 方法,这个方法有什么用呢?
java开发里面有一门叫JNI(java Native Interface)的技术,使用本机操作系统提供的函数,而这项技术不能离开特定的操作系统。

你想啊,要线程能执行,就需要线程所在操作系统为其分配资源,而start()方法中的start0()就相当于拥有JVM的功能,即能自动为不同操作系统启动多线程分配资源。

所以,Thread类中的start()方法不仅能启动多线程,还能自动为不同操作系统启动多线程分配资源。

2、实现Runnable接口(线程起点是run()方法,不变的)

接口一摆出来,其实它的优势就出来了,就Thread类而言,虽然可以在主体类中实现了多线程的定义,但java由于单继承性,所以Thread类创建线程具有局限性。但是!但是!要想启动多线程,必须依靠Thread类来完成,因为Runnable没有start()方法。Thread类中定义了public Thread(Runnable target)构造方法来接收Runnable接口对象(即也能接收子类对象)。

public class TestDemo { //主类
	public static void main(String[ ]args) {
		MyThread mt1 = new MyThread("线程A") ;
		MyThread mt2 = new MyThread( "线程B") ;
		MyThread mt3 = pew MyThread("线程C") ;
		new Thread(mt1).start();//关键性的一步
		new Thread(mt1).start();
		new Thread(mt1).start();
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值