Java 多线程 --- 创建线程, 线程状态

2023-11-11

如何创建线程

使用Thread类

  • 创建一个类继承Thread类
  • 重写该接口的run()方法,该run()方法的方法体是该线程的线程执行体
package SimpleThread;

public class SimpleThread extends Thread {
	static int count = 0;
	//重写run方法, 具体业务逻辑的实现
	@Override
	public void run() {
		while(true) {
			System.out.println("Hello: " + count);
			try {
				Thread.sleep(1000);
				count++;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	public static void main(String[] args) {
		//创建Cat对象,可以当做线程使用
        SimpleThread thread = new SimpleThread();
        //启动线程
        thread.start();
    }
}

使用Runnable接口

  • 创建一个类实现Runnable接口, 并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
  • 创建Runnable实现类的实例, 然后使用Runnable实例创建一个Thread实例,
  • 调用Thread实例的start方法开始线程
    在这里插入图片描述
package SimpleThread;

public class SimpleRunnable {
	
	//创建一个类实现Runnable接口
	public static class TaskOne implements Runnable{
		static int count = 0;
		//重写该接口的run()方法
		@Override
		public void run() {
			while(true) {
				count++;
				System.out.println("taskOne: " + count);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}

	}
	//创建一个类实现Runnable接口
	public static class TaskTwo implements Runnable{
		static int count = 0;
		//重写该接口的run()方法
		@Override
		public void run() {
			while(true) {
				count++;
				System.out.println("taskTwo: " + count);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}
	}
	
	public static void main(String[] args) {
		//创建Runnable实现类的实例
		TaskOne taskOne = new TaskOne();
		TaskTwo taskTwo = new TaskTwo();
		//使用Runnable实例创建Thread实例
		Thread t1 = new Thread(taskOne);
		Thread t2 = new Thread(taskTwo);
		//调用Thread实例的start方法开始线程
		t1.start();
		t2.start();
		
	}
}

使用Runnable接口和继承Thread类的区别 (continue)

使用Runnable接口

  • 优点
  • 使用Runnable接口的类还可以继承其他类
  • 多个线程可以共享一个target对象
  • 缺点
  • 编程稍微复杂, 比如要访问当前线程, 则必须使用Thread.currentThread()方法

继承Thread类

  • 优点

编写简单, 比如需要访问当前线程,则直接使用this

  • 缺点

因为已经继承了Thread类, 则不能继承其他父类

线程状态

New Threads

  • 当用new符号创建线程时, 比如 new Thread(r). 这个线程还不在运行状态, 而属于new threads.
  • 在这个阶段, 会进行线程的资源分配

Runnable Threads

  • 当一个thread调用statr方法时, 这个线程处于 runnable 状态
  • 一个runnable状态的线程可能在也可能不在运行, 取决于操作系统有没有让这个线程运行
  • Java specification 没有区分 running和runnable, 一个running thread依然是runnable state
  • Always keep in mind that a runnable thread may or may not be running at any given time

Blocked and Waiting Threads

  • 阻塞状态(Blocked) 阻塞状态是线程因为某种原因放弃CPU使用权,进行上下文切换, 暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
  • 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
  • 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入Entry Set中.
  • 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

Terminated Threads

  • It dies a natural death because the run method exits normally. (包括使用interrupt)
  • It dies abruptly because an uncaught exception terminates the run method

在这里插入图片描述

线程优先级 Thread Priorities

  • 每一个线程都有优先级
  • 一个线程默认继承父类线程的优先级, 但是也可以通过setPriority设置线程优先级. From MIN_PRIORITY (数值为1) to NORM_PRIORITY (数值为5)
  • 当scheduler选择线程时, 优先选择优先级高的线程.
  • 线程优先级根据系统不同也会有改变. Java虚拟机会根据host操作系统改变对应的系统优先级, 比如Windows有7个优先级, 有些Java的优先级会有一样的操作系统优先级. In the Oracle JVM for Linux, thread priorities are ignored altogether—all threads have the same priority
  • 如果有几个线程的优先级很高, 则低优先级的线程可能会处于饥饿状态
  • 所以不要将程序的正确性依赖于线程优先级.
    在这里插入图片描述

守护线程 Daemon Thread

  • 当一个线程的唯一作用是服务于其他线程时, 比如timer thread给其他线程发送"timer ticks" , 这个线程被叫做Daemon Thread.
  • 可以通过t.setDaemon(true)将一个线程设置为Daemon Thread
  • 当只有daemon thread 存在时, JVM会自动退出.
  • 不要让Daemon Thread使用persistent resource, 比如数据或者文件. 因为daemon thread可能随时被终止.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 多线程 --- 创建线程, 线程状态 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s

随机推荐

  • VSCode配置C/C++语言环境(2023版)

    基本步骤 下载并安装VSCode vscode下载地址https code visualstudio com 不会安装vscode的看下方博客 超详细VSCode安装教程 Windows 索儿呀的博客 CSDN博客 安装C 插件 安装编译器
  • ISO感光度

    数码相机的ISO是通过调整感光器件的灵敏度或者合并感光点来实现的 早在胶片时代我们的摄影生活就默默遵循这一行业标准 购买胶卷时包装上都会标示ISO 100 ISO 200 ISO400这样的字样 此处的ISO数值越大 表示胶卷的感光速度越快
  • c语言程序设计函数题,C语言程序设计函数练习题及参考答案

    C语言程序设计函数练习题及参考答案 由会员分享 可在线阅读 更多相关 C语言程序设计函数练习题及参考答案 60页珍藏版 请在人人文库网上搜索 1 C语言程序设计练习题及参考答案 1 定义一个函数int fun int a int b int
  • 二本机械毕业2年,从外包ETL到大厂数据开发,月薪13K到年薪40W

    点击上方 大数据肌肉猿 关注 星标一起成长 后台回复 加群 进入高质量学习交流群 2021年大数据肌肉猿公众号奖励制度 今天分享的是学习群的一位同学的求职经历 他二本机械专业毕业2年 毕业后培训了一段时间找了份11K的外包 两年涨到了13K
  • LC振荡器设计

    设计要求 设计出振荡频率为10GHZ的LC振荡器 如有侵权即删 一 设计步骤 1 选取LC振荡回路的值 f L 5 经验公式 可能会根据工艺的不同而变化 可以提前测试 f 10GHZ 得到选取的L值为0 5nH 寄生电阻设置为50m 注意
  • docker和k8s面试题总结(未完待续)

    6 容器类面试题 6 1 docker有几种网络模式 容器和容器之间怎么通信 主机和主机之间怎么通信 docker 有四种网络模式 none 桥接 默认模式 Host container 容器之间通过桥接模式进行通信 跨主机的容器之间通过静
  • easypoi基本使用-Excel数据的导入导出

    1 为什么要用easypoi 实现excel表格的导入导出 基于模板的导出 easypoi简化poi的操作 让人更加快速上手使用 2 easypoi使用 引入依赖
  • Git-gitignore规则之“感叹号“的用法坑点

    本文只讲一个知识点 开头的模式标识否定 该文件将会再次被包含 如果排除了该文件的父级目录 则使用 也不会再次被包含 以下面的例子进行说明 目标是要保留文件夹1中所有各层文件夹中的c文件 其他都不要 文件夹1 test c一个文件 文件夹1
  • 文件——统计成绩

    从键盘输入以下10 个学生的学号 姓名 以及数学 语文和英语成绩 写到文本文件f3 txt 中 再从文件中取出数据 计算每个学生的总成绩和平均分 并将结果显示在屏幕上 程序 include
  • vscode开启鼠标滚轮缩放字体大小设置

    打开首选项 进入设置 搜索zoom 给滚轮缩放字体选项打上钩 完成
  • Flutter实战篇(1):使用第三方极光认证一键登录

    Flutter实战篇 1 使用第三方极光认证一键登录 需求场景 在项目中有时会碰到需要手机号一键登录的需求 那么我们可以利用第三方极光平台的认证模块进行集成 实操Let s Go 首先导入第三方官方插件 jverify jverify 2
  • LaTex排版技巧:[15]公式太长如何换行?

    https jingyan baidu com article d7130635045b2013fcf47543 html LaTeX作为一个功能强大国际通用的排版软件 它特别适合于数理科学中科技论文 专业书籍排版 LaTeX尤其适合于各种
  • Python案例分析:使用LightGBM算法、随机森林、五折交叉验证进行分类预测

    1 数据导入 import pandas as pd import numpy as np import warnings from imblearn import under sampling over sampling from imb
  • 【计算机毕业设计】redis的电商秒杀系统

    redis的电商秒杀系统 开发语言 Java 框架 springcloud JDK版本 JDK1 8 服务器 tomcat7 数据库 mysql 5 7 一定要5 7版本 数据库工具 Navicat11 开发软件 eclipse myecl
  • MySQL中limit对于order by的优化

    一 无limit的场景对于order by如何优化 考虑无limit的order by语句 下面假设age是一个普通索引 1 1 查询无覆盖索引 select from emp order by age 此句中 查询的字段和order by
  • slf4j如何进行logback配置呢?

    转自 slf4j如何进行logback配置呢 slf4j简介 slf4j simple logging facade for java的缩写 翻译为java的简单日志外观 slf4j是一个开源项目 它提供我们一个一致的API来使用不同的日志
  • js逆向工具-nodejs服务使用

    目录 一 运行js文件 二 引入或开放接口模块 1 提供模块公开接口module exports 2 引入模块require 三 GET POST请求 1 获取GET请求内容 2 获取Post请求内容 四 创建Web服务器 客户端 1 No
  • Select的OnChange()事件

    我们用Select的onchange事件时 常会遇到这样一个问题 那就是连续选相同一项时 不触发onchange事件 select的onchange事件就是这样子的 你得有Change 改变 才能触发该事件 掌握了它的特性后 相应的解决办法
  • 操作系统-进程API

    概述 进程的基本操作接口 进程创建 fork spawn vfork clone 进程执行 exec 进程间同步 wait 进程退出 exit abort 进程创建 fork fork 语义 为调用进程创建一个一模一样的新进程 fork后的
  • Java 多线程 --- 创建线程, 线程状态

    Java 多线程 创建线程 线程状态 如何创建线程 使用Thread类 使用Runnable接口 使用Runnable接口和继承Thread类的区别 continue 线程状态 New Threads Runnable Threads Bl