千家信息网

Thread的start和run方法的区别是什么

发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,这篇文章将为大家详细讲解有关Thread的start和run方法的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Thread中的start(
千家信息网最后更新 2024年11月18日Thread的start和run方法的区别是什么

这篇文章将为大家详细讲解有关Thread的start和run方法的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

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。

关于Thread的start和run方法的区别是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

方法 线程 状态 运行 代码 实例 接口 标记 内容 只是 时间 资源 两个 对象 文章 更多 知识 程序 篇文章 结果 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 我国网络安全事件统计 药品广告数据库康恩贝15秒 软件开发升级维护方案 七日杀能不能转让服务器 服务器回档是什么意思 无盘系统服务器 服务器经脉调整教程 学网络安全c语言好吗 海珠区无源网络技术开发商家 王牌战争服务器怎么切换模式 数据服务器由哪些元器件 怎么管理企业网络安全 连接数据库时的安全验证 数据库中的表建立分两个步骤 不启用dhcp服务器 网络安全标准时间案例应用 软件开发前端和后端有什么区别 笔记本网络安全模式正常 河南缤果网络技术有限公司招聘 服务器新增内存条开机无反应 mysql数据库增加数据表 网络安全和前端哪个需求大 数据库点带出字段 贝尔实验室 软件开发 软件开发不研究程序 windows服务器怎么校时 微信数据库在哪个国家 电脑网络安全手抄报党史 软件开发前端和后端有什么区别 连接数据库要关哪些防火墙
0