在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
Thread中的start()和run()是Java的多线程概念最重要的两个方法,相信大家在Java学习中,或多或少会对两者的区别搞不清楚。因此本文就来和大家谈谈start和run方法,主要内容包括:认识start和run方法、两者的区别、代码实例和线程状态说明。
一、认识Thread的start和run方法。
1、Java中的start()方法是什么?
线程类的start()方法可以用来启动线程;该方法会在内部调用Runnable接口的run()方法,以在单独的线程中执行run()方法中指定的代码。
start()方法启动线程执行以下任务:
它统计了一个新线程
线程从New State移动到Runnable状态。
当线程有机会执行时,它的目标run()方法将运行。
2、Java中的run()方法是什么?
线程类的run()方法是Runnable接口的一个抽象方法,由java虚拟机直接调用的,不会创建的新线程。
二、start()方法和run()方法的区别。
1、方法的定义
start()方法在java.lang.Thread类中定义;而,run()方法在java.lang.Runnable接口中定义,必须在实现类中重写。
2、新线程创建
当程序调用start()方法时,会创建一个新线程,然后执行run()方法。但是如果我们直接调用run()方法,则不会创建新的线程,run()方法将作为当前调用线程本身的常规方法调用执行,并且不会发生多线程。
3、多次调用
start()方法不能多次调用,否则抛出java.lang.IllegalStateException;而,run()方法可以进行多次调用,因为它只是一种正常的方法调用。
三、代码实例:
通过start启动线程,异步启动
public static void?main(String args[]) {
Thread t = new?Thread() {
public void?run() {
pong();
}
};
t.start();
System.out.print("ping");
}
static?void?pong() {
System.out.print("pong");
}
输出结果: pingpong
通过run启动线程,同步启动
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
}
static?void?pong() {
System.out.print("pong");
}
输出结果:pongping
通过以上两个程序实例,可以很容易的区分出start()方法和run()方法的区别:
t.start(); 该行代码相当于是启动线程,异步操作
t.run(); 该行代码相当于是使用t这个类中的run方法而已,只是主线程的一个普通的方法
四、线程状态说明
线程状态从大的方面来说,可归结为:初始状态、可运行状态、不可运行状态和消亡状态,说明如下:
1)线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了thread实例后,线程就进入了初始状态;
2)当该对象调用了start()方法,就进入可运行状态;
3)进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;
4)进入运行状态后情况就比较多,大致有如下情形:
a. run()方法或main()方法结束后,线程就进入终止状态;
b. 当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片; 当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被锁(synchroniza,lock),将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配 CPU时间片;
c. 当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。 当线程调用stop方法,即可使线程进入消亡状态,但是由于stop方法是不安全的,不鼓励使用,大家可以通过run方法里的条件变通实现线程的 stop。
Java学习总结就讲到这里了,相信大家对Thread的start和run方法的区别,有了大概的了解。还想继续深入学习,就来报博学谷的在线课程吧!
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
如何自学Java编程?零基础小白入门须知
如何自学Java编程?相信这个问题在刚开始自学时就困扰着每一个Java小白。确实对于零基础的初学者来讲,Java并不是一门简单的编程语言,要想从入门到精通Java,必须要有详细的学习规划和方法,最好还要有具备自身Java开发经验老师的指导。不然只是头脑一热就决定学习Java,多半在半途就容易放弃。下面小编来和大家好好谈谈零基础小白入门Java要做到哪些准备,大家如果对Java学习又兴趣不妨看一看。
7156
2019-10-16 18:52:00
Java基础学习笔记之IO流案例
本文又是一篇关于Java基础学习的总结笔记,大家要是有学习需要可以接着看下去。众所周知,IO流指的是输入输出流,用来处理设备上的数据,这里的设备指硬盘、内存、键盘录入、网络传输等。本文要为大家介绍 IO流案例,主要内容包括案例需求、步骤分析、代码实现等等,现在一起来看看吧!
4684
2019-12-30 16:38:08
数据库服务的启动与登录学习笔记
MySQL服务器启动方式有两种,分别是通过服务的方式自动启动和手动启动的方式。本文总结了关于数据库服务的启动与登录的学习笔记,主要包括了Windows服务方式启动、DOS命令方式启动、控制台连接数据库、SQLyog图形化工具、MySQL目录结构、数据库管理系统,以及数据库管理系统、数据库和表的关系等内容。一起来详细看看吧!
4934
2020-07-13 16:25:51
Java是什么?有哪些特点?
Java是一门高级程序设计语言,从1995年被发布,到今天已经有25年的历史了。它的一大特点是跨平台,可运行于不同的操作系统,如Windows,Mac OS,以及多种UNIX版本的系统。根据Java的不同用途,可分为三个版本,分别是JavaSE、JavaEE以及JavaME。下面我们一起来深入了解一下Java这门编程语言。
5331
2020-08-07 14:53:47
小白Java学会了好找工作吗?很难吗?
ava学会了好不好找工作因人而异,学会了容易精通了难,如果是找初级Java程序员的岗位相对容易一些,目前市面上互联网企业比较多,Java相关岗位多,总的来说说比较好找工作。
4676
2020-09-21 17:24:48