Java的线程(Thread)、线程池(ThreadPool)

一、线程(Thread) 

1、线程的创建

Java创建线程是采用内核线程: 由操作系统内核支持的线程,通过操纵调度器对线程进行调度(内核切换线程),将线程的任务映射到各个处理器上。
调native方法 —> 调C++ -> 调操作系统(通过操作系统的库函数创建的线程)。
优点:
一个线程阻塞,不影响另一个线程的执行;
缺点:
1、由于是基于内核线程实现的,所以各种线程操作,如创建、休眠及同步,都需要进行系统调用,而系统调用的代价相对较高;
2、操作系统内核支持的线程数量是有限的,不能无限制地创建线程;

1.通过Thread类,重写run()方法

/*** 1.创建Thread*/
Thread thread01 = new Thread(){@Overridepublic void run(){Thread.currentThread().setName("new Thread的线程");System.out.println(""+Thread.currentThread().getName());}
};class  ThreadDemo extends Thread{@Overridepublic void run() {Thread.currentThread().setName("继承Thread的线程");System.out.println(""+Thread.currentThread().getName());}
}/*** 2.继承Thread类*/
ThreadDemo thread02 = new ThreadDemo1();
thread02.start();

2.通过Runnable接口,重写run()方法。

public class DisplayTime implements Runnable {@Overridepublic void run() {while (true) {System.out.println(Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

3.通过Callable接口,实现Callable和Future,重写Call()方法。

public class DisplayTime implements Callable<String> {@Overridepublic String call() throws Exception {System.out.println(Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}return "返回值";}public static void main(String[] args) {DisplayTime displayTime = new DisplayTime();FutureTask<String> stringFutureTask = new FutureTask<>(displayTime);new Thread(stringFutureTask, "线程一").start();try {System.out.println("线程的返回值:" + stringFutureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}

2、线程的属性

线程是一个可调操作系统的对象,他的start()、stop()、yield()、sleep(long var0)...等线程方法都是调用操作系统执行。

public class Thread implements Runnable {private long tid; 线程的ID, 由线程自己分配private volatile String name; 线程的名称, 可以手动设置(setName())private int priority; 线程的优先级, 默认5, 最小1, 最大10private ThreadGroup group; 线程所属的线程组private ClassLoader contextClassLoader; 次线程上下文ClassLoaderprivate boolean daemon = false; 是否是守护线程private volatile int threadStatus = 0; 线程的状态. 对应静态枚举类Stetepublic void run(){} 线程的功能方法public synchronized void start(){} 线程准备就绪,等待程序调用run()方法. 异步操作, 调用顺序不代表实际启动的顺序.public final void stop(){} 终止当前线程, 不建议使用public static native void sleep(long var0){} 指定毫秒数让正在执行的线程暂停, 具体取决于系统定时器和调度程序的精度和准确性public final void setPriority(int var1){} 设置优先级, 不一定有用, 影响线程执行优先级的因素很多public final void setDaemon(boolean var1){} 设置守护线程标识public static native void yield(){} 放弃当前CPU执行资源,放弃时间不确定public final native boolean isAlive(){} 判断线程是否处于活动状态. 活动状态: 启动未终止public final void resume(){} 恢复线程, 不建议使用public final void suspend(){} 暂停线程, 不建议使用public void interrupt(){} 中断线程public static boolean interrupted(){} 测试当前线程是否中断, 并且具备清除状态的功能public boolean isInterrupted(){} 测试当前线程是否中断public final void join(){} 等待调用的这个线程终止public Thread.State getState(){} 获取线程状态
}

3、线程的状态

1.新建(New):创建后未启动(未调用start()方法)的线程处于这种状态。
2.就绪(Ready):调用start()方法,进入就绪状态。等待CPU调度执行。
3.运行(Running):该状态可能正在CPU执行,也可能在等待CPU执行。
    注意: 线程要想进入运行状态执行,首先必须处于就绪状态中。
4.无限期等待(Waiting):不会分配CPU执行时间,要等待被其他线程显式唤醒。Object.wait()方法可让其无限等待
5.限期等待(Timed Waiting): 不会分配CPU执行时间,在一定时间之后它们会由系统自动唤醒。Object.wait(long millis)方法让线程进入限期等待状态。
6.阻塞(Blocked):线程在获取排他锁失败(因为锁被其它线程所占用),进入同步阻塞状态。
7.死亡(Dead):线程执行完了或者因异常退出了run()方法,该线程生命周期结束。

4、线程的一些方法

1.Thread.sleep(long millis):当前线程调用此方法,进入阻塞,不释放对象锁,线程自动唤醒进入可运行状态。
2.Thread.yield():
当前线程调用此方法,放弃获取的cpu时间片,由运行状态变可运行状态,让OS再次选择线程。实际中无法保证yield()达到让步目的,Thread.yield()不会导致阻塞。
3.Thread.join()/thread.join(long millis):当前线程里调用其它线程的join方法,当前线程阻塞,但不释放对象锁,待别的线程执行结束,当前线程进入可运行状态。
4.Obj.wait():当前线程调用释放对象锁(需先拿锁),进入等待队列。
5.Obj.notify():唤醒在此对象监视器上等待的单个线程,选择是任意性的
6.Obj.notifyAll():唤醒在此对象监视器上等待的所有线程。

二、线程池(ThreadPool) 

1、ThreadPool属性及参数

2、

3、

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

buuctf pwn入门1

目录 1. test_your_nc(简单nc ) pwn做题过程 2. rip(简单栈溢出) 3. warmup_csaw_2016(栈溢出 覆盖Return_Address) 4. ciscn_2019_n_1(栈溢出 浮点数十六进制) (1) 覆盖v2值 (2) 利用system("cat /flag"); 5. pwn1_sctf_2016(字符逃逸栈溢出 32位) 6. jarvis…

【Linux】什么是文件系统及inode?如何创建软硬链接?软硬链接有什么作用?

inode软硬链接创建软硬链接理解硬链接理解软链接 inode 了解一下文件系统&#xff1a; Linux ext2文件系统&#xff0c;上图为磁盘文件系统图&#xff08;内核内存映像肯定有所不同&#xff09;&#xff0c;磁盘是典型的块设备&#xff0c;硬盘分区被 划分为一个个的block。…

使用MATLAB画SCI论文图

从gcf和gca说起 不论是 Python 绘图还是Matlab绘图&#xff0c;想要获得更好看的图&#xff0c;都会用到这两个单词。 gcf&#xff1a;get current figure&#xff0c;是目标图像的图形句柄对象 gca&#xff1a;get current axes&#xff0c;是目标图像的坐标轴句柄对象 Mat…

基于条件风险价值CVaR的微网动态定价与调度策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

el-tab-pane 和el-tooltip及el-tree 组合使用

<el-tabs v-model"groupId" tab-click"handleClick"><el-tab-pane label"全部" name"0"></el-tab-pane><el-tab-pane v-for"items in editableTabs" :key"items.group_id" :name"item…

java项目之美食推荐管理系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的美食推荐管理系统。 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm&#xff0c;mybatis JDK版…

2.3 Web应用 -1 web 应用概述

2.3 Web应用 -1 web 应用概述 Web与HTTPHTTP协议概述 Web与HTTP World Wide Web: Tim Berners-Lee 网页网页互相链接 网页(Web Page)包含多个对象(objects) 对象&#xff1a;HTML文件、JPEG图片、视频文件、动态脚本等基本HTML文件&#xff1a;包含对其他对象引用的链接 对象的…

【MongoDB】

目录 MongoDB基本简介 MongoDB基本概念 MongoDB和关系数据库的对比 MongoDB数据类型 MongoDB元素命名规则 MongoDB安装部署 MongoDB配置管理 MongoDB服务管理 MongoDB 多实例配置 基本操作 集合 数据备份与恢复 MongoDB复制集集群部署及管理 MongoDB复制集ReplSe…

OPCUA 的历史数据库/聚合服务器的实现细节

进入了AI 大数据时代&#xff0c;无论是工业自动化系统&#xff0c;还是物联网系统&#xff0c;对大数据的采集&#xff0c;存储和分析都十分重要。大数据被称为工业的石油&#xff0c;未来制造业的持续改善离不开大数据。 传统的应用中&#xff0c;历史数据的存储是特定的数据…

Oracle存储过程的使用DEMO(一)

文章目录 Oracle存储过程的使用DEMO&#xff08;一&#xff09;1. Oracle中块的使用2. IF使用2.1 IF...ELSE...2.2 IF嵌套 3. CASE...WHEN...4. LOOP5. WHILE6. FOR Oracle存储过程的使用DEMO&#xff08;一&#xff09; 1. Oracle中块的使用 DECLAREI NUMBER; BEGINSELECT EM…

TPCE260PCIE转PMC载板

TPCE60是一个标准的高度PCI Express版本1.1兼容的模块&#xff0c;提供了一个槽用于安装标准PMC模块&#xff0c;灵活和成本有效的I/O解决方案的各种应用如过程控制、医疗系统、电信和交通控制。 桥接PCI Express x1连接到主机板和PCI总线信号的PMC槽之间是由透明的PCIe到PCI桥…

硬件性能 - 网络瓶颈分析

简介 本文章主要通过Linux命令查看网络信息、判断是否出现网络瓶颈等简单分析方法。其他硬件性能分析如下&#xff1a; 1. 硬件性能 - CPU瓶颈分析 2. 硬件性能 - 掌握内存知识 3. 硬件性能 - 磁盘瓶颈分析 目录 1. 监控命令 sar 2. 带宽利用率 3. 网络延迟 4. 网络连接数 …