Java线程

Java线程

[本博客记录与Kali Linux]

线程的创建方式

无论哪种方式创建线程,最底层都是实现Runnable接口

  1. Thread类实现了Runnable接口,因此继承Thread就相当于实现了Runnable
  2. Runnable…就是实现了Runnable接口
  3. FutureTask类实现了RunnableFuture接口,而RunnableFuture继承了Runnable接口
  4. 线程池,每次构建线程是都是Worker类,而Worker类实现了Runnable

1. 继承Thread类

继承Thread类,然后直接run

class T extends Thread{
	@Override
	public void run(){
		System.out.println("创建了一个新的线程");
	}
}
public class M{
	public static void main(String[] args){
		T t = new T();
		t.run();
	}
}

2. 实现Runable接口

public class R implements Runnable{
	@Override
	public void run(){
		System.out.println("创建了一个新的线程");
	}
}
public class M{
	public static void main(String[] args){
		R r = new R();
		Thread T = new Thread(r);
		r.start();
	}
}

3. 实现Callable,配合FutureTask实现返回值

public class C implements Callable{
	@Override
	public Object call(0 throws Exception{
		System.out.println("创建了一个新的线程,并且返回1;")
		return 1;
	}
}
public class M{
	public static void main(String[] args) throws ExecutionException,InterruptedException{
		C callable = new C();
		FutureTask futureTask = new FutureTask(callable);
		Thread t = new Thread(futureTask);
		t.start();
		Object i = futureTask.get();
		System.out.println("返回值为:"+i);
	}
}

4. 基于Lambda方式

Thread t = new Thread(()->{
	System.out.println("创建了新的线程");
});

### 5. 基于线程池构造线程
```java
......

线程的状态

在Java中,Java给我们提供了6种线程状态,见下方源码:

new --> ready --> running --> wait/sleep/join()
|__ Terminated

// 源码
public enum State{
	NEW, 				// 创建线程
	RUNNABLE, 	//就绪状态
	BLOCKED, 	// 等待(一般只有拿synchronized的时候才会出现这种状态)
	WAITING, 		// 等待(手动唤醒)
	TIMED_WAITING, // 时间等待(时间结束后自动唤醒)
	TERMINATED;	// 结束
}

如何结束线程

1.stop方法,强制线程结束(不推荐)
2.interrupt方法
3.使用共享变量

2.interrupt方式

// 默认interrupt是false
Thread.currentThread().isInterrupted(); // 获取中断标记位的状态
Thread.currentThread().interrupt(); //标记从false变为true,中断线程
Thread.currentThread().interrupted(); //获取状态后将状态重新变为默认的false状态

3. 使用共享变量

static volatile boolean flag = true;
public static void main(String[] args) throws InterruptedException{
	Thread t1 = new Thread(()->{
		while(flag){
			// 处理任务
		}
	});
	t1.start();
}

Java线程中wait与sleep的区别

  1. sleep属于Thread类的静态方法,而wait是属于Object的,任何对象都可以执行
  2. sleep属于TIME_WAITING,会被自动唤醒,而wait()方法需要被手动唤醒
  3. sleep方法在持有锁时,执行不会释放锁资源,wait方法必须在持有锁时候才可以执行
    3.1 wait方法会将持有锁的线程从owner扔到WaitSet集合中,这个操作实在修改ObjectMonitor对象,如果没有持有synchronized的话,是无法操作ObjectMonitor对象的。

并发编程的三大特性

  1. 原子性
  2. 可见性
  3. 有序性

1. 原子性

JMM(Java Memory Model)。不同的硬件和不同的操作系统字啊内存上的操作有一定差异,因此Java为了解决相同代码在不同操作系统上的各种问题,用JMM屏蔽掉各种硬件和操作系统的差异,以让Java的并发编程可以做到跨平台。
JMM规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算,然后再写回主内存中。
原子性:只一个操作是不可分割、不可中断的,一个线程在执行时候,另一个线程是不会影响到他的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/7223.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

43掌握自动化运维工具 Puppet 的基本用法,包括模块编写、资源管理

Puppet是一种自动化配置管理工具,可以自动化地部署、配置和管理大规模服务器环境。本教程将介绍Puppet的基本用法,包括模块编写和资源管理。 模块编写 在Puppet中,模块是一组相关的类、文件和资源的集合。模块可以用于部署和配置应用程序、服…

图形编辑器:排列移动功能的实现

大家好,我是前端西瓜哥。这次来实现一下图形编辑器排列(arrange)功能的实现。 先看效果。 有四种移动方式: 置顶(Front):将指定的图形移动到顶部;置底(Back&#xff09…

嵌入式学深度学习:1、Pytorch框架搭建

嵌入式学深度学习:1、Pytorch框架搭建1、介绍2、Pytorch开发环境搭建2.1、查看GPU是否支持CUDA2.2、安装Miniconda2.3、使用Conda安装pytorch2.4、安装常用库3、简单使用验证1、介绍 深度学习是机器学习的一种,如下图: 目前深度学习应用场景…

MySQL-四大类日志

目录 🍁MySQL日志分为4大类 🍁错误日志 🍃修改系统配置 🍁二进制日志 🍃查看二进制日志 🍃删除二进制日志 🍃暂时停止二进制日志的功能 🍁事务日志(或称redo日志) 🍁慢查…

chatgpt3中文辅助写作-gpt2中文文本生成

GPT-3是一种深度学习模型,具有潜在的巨大计算成本和训练麻烦。根据OpenAI公司的官方消息,训练GPT-3是一项昂贵的和耗时的过程,在OpenAI公司,训练GPT-3的成本已经超过了10亿美元。考虑到GPT-3的架构、规模和训练时间,这…

高分子PEG磷酸盐mPEG-phosphoric acid,Phosphate PEG,甲氧基聚乙二醇磷酸,可用于修饰金属氧化物表面

规格单位:g |货期:按照具体的库存进行提供 | 端基取代率:95% 中英文名:mPEG-phosphoric acid|Phosphate PEG|甲氧基聚乙二醇磷酸​ 一、Phosphate PEG化学结构式: 二、产品详情: 外观:灰白…

[oeasy]python0123_中文字符_文字编码_gb2312_激光照排技术_王选

中文编码GB2312 回忆上次内容 上次回顾了 日韩各有 编码格式 日本 有假名 五十音一字节 可以勉强放下 有日本汉字 字符数量超过20000 韩国 有谚文 数量超过500一个字节 放不下 有朝鲜汉字 字符数量超过20000 作为 汉字源头的中国 究竟应该 如何对汉字 进行编码 呢&#x…

操作系统-AOSOA

一、个人感受 1.1 权衡 在我写这份报告的时候,已经是 6 月 30 号了,经历了一个学期的“折磨”,我面对终点,已经没啥感觉了,就想着赶快呼噜完了就完事了。其实做这个项目最大的体会就是“人力有穷,一切皆权…

视频剪辑:教你如何调整视频画面的大小。

大家应该都会调整图片的大小吧,那你们会调整视频画面的大小吗?我想,应该会有人不还不知道要调整的吧,今天就让小编来教大家一个方法怎样去调整视频画面的大小尺寸。 首先,我们要有以下材料: 一台电脑 【…

列的类型定义——整形类型

文章目录 前言一、整数类型的附带属性 类型名称后面的小括号unsignedauto_increment总结前言 1)采用26字母和0-9的自然数加上下互相 ‘_’ 组成,命名简洁明确,多个单词用下划线 ‘_’ 隔开 2)全部小写命名,尽量避免…

【SpringBoot】自定义Starter

🚩本文已收录至专栏:Spring家族学习之旅 👍希望您能有所收获 一.概述 在使用SpringBoot进行开发的时候,我们发现使用很多技术都是直接导入对应的starter,然后就实现了springboot整合对应技术,再加上一些简…

【论文导读】Inferring deterministic causal relations

前段时间看Scholkopf教授的《Towards Causal Representation Learning》,看到这篇挺有意思来读读。 这一篇只在Arxiv上挂着,重点主要是研究发掘两变量之间的因果关系(无法应用独立性检验等方法),引入了信息论中的正则…

Elasticsearch:配置选项

Elasticsearch 带有大量的设置和配置,甚至可能让专家工程师感到困惑。 尽管它使用约定优于配置范例并且大部分时间使用默认值,但在将应用程序投入生产之前自定义配置是必不可少的。 在这里,我们将介绍属于不同类别的一些属性,并讨…

2023年泰迪杯数据挖掘挑战赛B题--产品订单数据分析与需求预测(2.数据探索性分析)

前言 继续上一片数据预处理进行续写,利用预处理之后的数据进行数据分析并且解决问题一相关的问题。问题一主要目的是让研究各种因素对于需求量的影响,然后找到确定影响需求量的主要因素并且进行数据分析和主要特征抽取。 对于问题提出的八个小问&#…

解决云服务器ssh经常断开的问题

问题描述:无论是腾讯云服务器还是阿里云服务器等,在使用MobaXterm或者Xshell连接云服务器时,如果十分钟左右无任何操作,ssh就会自动断开,非常烦人,下面提供几种方法来解决该问题。 MobaXterm的报错如下&am…

Cookie和Session的工作流程及区别(附代码案例)

目录 一、 HTTP协议 1.1 为什么HTTP协议是无状态的? 1.2 在HTTP协议中流式传输和分块传输编码的区别 二、Cookie和Session 2.1 Cookie 2.2 Session 2.3 Cookie和Session的区别 三、servlet中与Cookie和Session相关的API 3.1 HttpServletRequest 类中的相关方…

mysql与redis区别

一、.redis和mysql的区别总结 (1)类型上 从类型上来说,mysql是关系型数据库,redis是缓存数据库 (2)作用上 mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢 redis用于存储使…

【新2023Q2押题JAVA】华为OD机试 - 挑选字符串

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:挑选字符串 题目 给定a-z,…

二.microchip samE54-- ATSAME54P20A 开发板使用总结

板子图片 2.1 板子硬件资源 2.1.1 外部插件1 2.2.2 外部插件2 2.2.3 外部插件3 2.2.IDE KIT连接(USB DEBUG) 板子自带,不是JLINK 出现这个说明板载 调试软件识别成功 2.3 编译与下载 D:\HarmonyProjects\usart\usart_echo_blocking\f…

DataHub调研数据血缘

DataHub调研&数据血缘 1. DataHub? 阿里的数据工具datahub? 回答: 不是 DataHub是由Linkedin开源的,官方喊出的口号为:The Metadata Platform for the Modern Data Stack - 为现代数据栈而生的元数据平台。官方网站A Metadata Platfo…