Java线程的基本机制

Transformers 中的 Softmax 可以并行加速么? 通过融合前两个计算步骤,降低执行Reduce_max和Reduce_sum等操作的通信开销。利用共享内存来存储临时数据,以减少对全局内存的访问成本。 阅读详情

线程

1、Java采用比较传统的方式,在顺序语言的基础上提供对线程的支持:多线程机制是在由执行程序所表示的单一进程中创建任务;

2、Java的线程机制是抢占式,即调度周期会周期性地中断线程,将上下文切换到另一个线程,从而为每一个线程提供时间片,使得每一个线程都会分配到数量合理的时间去驱动它的任务;


3、线程(Thread):一个任务从头到尾的执行流;
4、时间共享(time sharing):单处理器系统中,多个线程共享CPU时间;
5、当程序作为一个应用程序执行,java解释器为main方法启动一个线程;
     当程序作为一个Applet执行时,Web浏览器会自动启动一个线程运行applet;
6、线程的状态:新建(new),就绪(Runnable),运行(Run),阻塞(Blocked),结束(Dead):
     





基本的线程机制


1、 创建线程的基本步骤:①创建Runnable任务类,并实现run方法;
                                        ②创建Thread线程类,在主程中用该任务类的实例创建一个线程类Thread,并对其进行操作;

class DemoTask implements Runnable{
     public run(){
         statements;
         //线程暂停的2种常用方式
         Thread.sleep(1000); // 或 TimeUnit.MILLISECONDS.sleep(1000);使本线程休眠的便捷方法;
         Thread.yield();
     };
 }
 * void main(){
 *          Thread thread = new Thread(new DemoTask());
 *          thread.start();
 * }

※一般不会使用以上的方式直接运行线程,而是使用Executor线程池的方式管理线程,主要的优点有:
①Executor拥有更好地性能;
②Executor能更多地管理线程的行为;


2、Thread线程类


1) Thread.sleep(millis):使线程暂停millis后,回到可执行状态 //  便捷方法TimeUnit.MILLISECONDS.sleep(1000);
    Thread.yield():使线程提前结束CPU为其分配的时间片,在下一个时间片线程恢复到可执行状态;
2)join、sleep方法会引起一个必检的异常:InterruptedException;
     线程的join、sleep可以使用interrupt()方法打断;
3)线程优先度常量:MIN_PRIORITY(0), NORM_PROORITY(5,主程优先度), MAX_PRIORITY(10);



3、Executor 线程池管理器

1)线程池在Java SE5被引入,使用Java.util.concurrent包中的执行器(Executor)可以对Thread对象进行管理,Executor在客户端和任务执行之间提供了一个间接层,Executor在SE5/SE6时启动任务的优选方式;

2)使用线程池基本步骤:①创建线程池;
                                       ②将任务类加入到线程池;
                                       ③对线程池加入任务类后的状态进行操作;
import java.util.concurrent.*;
 void main() {
           ExecutorService executor = Executors.newFixedThreadPool(n);   /newCachedThreadPool();
           executor.execute(new Task());
           executor.shutdown();   /shutdownNow();

//shutdown()能防止新任务被提交给改Executor,当前线程将继续运行在shutdown之前提交的所有任务;



3)线程池的类别:
①newCachedThreadPool :创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程;
ExecutorService executor = Executors.newFixedThreadPool();
int size = new Random().nextInt(100);
for(i = 0;i<size;i++)
     executor.exetutor(new Runnable()); 

②newFixedThreadPool :创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待;
ExecutorService executor = Executors.newFixThreadPool(5);
for(int i=0;i<10;i++)
     executor.execute(new Runnable());
//此时有5个任务类被阻塞,直到executor内的线程执行完毕空出位置;

③newSingleThreadExecutor :创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行;
ExecutorService executor = Executors.newSingleThreadPool();
//相当于newFixedThreadexecutor(1);

④newScheduledThreadPool :创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
ScheduledExecutorService executor = Executors.newSchrduledThreadPool(5);
executor.schedule(new Runnable() , 1,TimeUnit.SECONDS);
////该线程延迟1秒后执行;
executor.scheduleAtFixedRate(new Runnable(),1,3,TimeUnit.SECONDS);
//该线程延迟1秒后,每3秒执行一次;



4、Callable返回任务类
Runnable是执行工作的独立任务,但是它不返回任何值,如果希望任务在完成时能够返回一个值,可以实现Callable接口取代Runnable接口,同时实现call()方法;
calss DemoTask implements Callable<Date>{
     public Date call(){
          return new Date();
     }
}
main(){
     ExecutorServices exetuor = Executors.newCashedThreadPool();
     List<Future<Date>> results = ArrsyList<Future<Date>>();
     for(int i=0;i<10;i++)
          results.add(executor.submit(new DemoTask()));
    
     //使用submit方法会产生Future对象,可以使用isDone()来检测Future是否已经完成,使用get()获取具体值;
     for(Future<Date> fs : results){
          try{
               System.out.println(fs.get());
          }catch(InterruptedExcecption e){
          }catch(ExecutionException e){
          }fianlly{
               executor.shutdown();
          }
     }
}




5、优先级
1)线程的优先级将线程的重要性传递给调度器,调度器将更加倾向于让优先权较高的线程先执行(但不是优先权较低的线程得不到执行,只不过被执行的频率比较低);
2)在绝大多数时间里,所有线程都应该以默认的优先级运行;
3)线程优先度常量:MIN_PRIORITY(0), NORM_PROORITY(5,主程优先度), MAX_PRIORITY(10);
class Task implements Runnable{
     public void run(){
          Thread.currentThread().setPriority(MIN_PRIORITY);
     }
}




6、后台线程
1)后台(daemon)线程:程序在运行时在后台提供一种通用服务的线程,并且该线程不属于程序中不可或缺的部分;
2)但所有非后台线程结束时,程序也就终止,同时会杀死所有后台线程;反过来说,只要有任何非后台线程还在运行,线程就不会终止;
class DaemonTask implements Runnable{
     public void run(){
         statements;
         //Thread.currentThread().setDaemon(true);  直接在任务类中标注
     }
}
main(){
     Thread daemon = new Thread(new DaemonTask());
     daemon.setDaemon(true);
     daemon.start();
}




7、直接继承Thread创建线程
class DemoThread extends Thread{
     public DemoThread(){
          super("testdemo");
          start();
     }
     public void run(){    
          statements;
     }
     public static void main(){
          new DemoThread();
     }
}




8.volatile关键字
volatile关键字:被设计用来修饰被不同线程访问和修改的变量,防止编译器对其进行优化操作,如:
int num = 0;
num = 1;
num = 2;
num = 3;
以上编译器会优化为int num = 3 一条语句,这对多线程是很不利的;
可以通过使用volatile修饰num,使编译器放弃优化,全部执行4个动作;
int volatile num = 0;


9.多线程下的异常捕获
1)由于线程的本质特性,是无法捕获从线程中逃逸的异常的,一旦异常逃出任务的run方法,它就会向外传播到控制台;
在java SE5中,可以使用Executor捕获这些异常,而在这之前,只能使用线程组来实现;
2)Thread.UnchaughtExceptionHandler是java SE5中的新接口,允许在每一个Thread对象上都覆着一个异常处理器,UnchaughtExceptionHandler会在线程在因未被捕获的异常而临近死亡时被调用;
3)使用线程池捕获线程异常实例代码
//定义抛出异常线程类
class TaskDemo implements Runnable{
     public void run(){
          throw new RunTimeException();
     }
}
//定义线程异常处理器
class UncaughtExceptionHandlerDemo implements Thread.UncaughtExceptionHandler{
     public void uncaughtException(Thread t,Throwable e){
          System.out.println("caught"+e);
     }
}
方式1.使用默认未捕获异常处理器
public static void main(String[] args){
     Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionDemo());
     ExecutorService exec = Executors.newCachedThreadPool();
     exec.execute(new TaskDemo());
}
方式2.使用自定义未捕获异常处理器
class HandlerFactory implements ThreadFactory{
 //自动创建线程,同时绑定未捕获异常处理器,可以在代码块里添加自定义的处理语句;
     public Thread newThread(Runnable r){ 
          Thread t = new Thread(r);
          t.setUncaughtExceptionHandler(new UncaughtExceptionHandlerDemo());
          //System.out.println("eh"=t.getUncaughtexceptionHandler());
          return t;
     }
}
public static void main(String[] args){
     ExecutorService executor = Executors.newCachedThreadPool(new HandlerFactory());
     executor.execute(new ThreadDemo());
}





Odoo 入门 | 什么是 Odoo? Odoo是一套全球开源的ERP/CRM系统,最初的名字为TinyERP,08年5月之后称之为OpenERP,之后又改为Odoo。 阅读详情

相关推荐

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 488

基础线程机制

Executor Executor 管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期。这里的异步是指多个任务的执行互不干扰,不需要进行同步操作。 主要有三种 Executor: CachedThreadPool:一个任务创建一个线程; FixedThreadPool:所有任务只能使用固定大小的线程; SingleThreadExecutor:相当于大小为 1 的 FixedT...

程序猿_hw的博客 384

使用STC15F104W产生PWM脉冲

最近的小项目中使用到了STC15F104W产生PWM脉冲

yeats1989的专栏 1万+

java中线程机制

java中线程机制,线程创建的方法,多线程的实现

slhu的专栏 1138

iphone查看/private/var/mobile/Containers/Data/Application/文件

xcode查看iPhone的private/var/文件夹xcode连接iPhone真机选择app下载Containers文件夹到mac电脑中查看手机中下载的文件 使用xcode真机调试的时候,文件目录都是这种/private/var/mobile/Containers/Data/Application/FAEFDF4D-5CE4-474F-9C53-C19789DB59F6/tmp/ xcode连接iPhone真机 不需要越狱,使用xcode上连接iPhone,然后选择运行的app,选择window-&g

小手琴师的博客 101万+

VisionPro实战:5个工业视觉检测案例详解(附代码片段)

本文详细解析了VisionPro在工业视觉检测中的5个实战案例,包括PCB焊点质量检测、汽车齿轮尺寸测量、药品包装缺陷检测等。通过硬件配置方案和软件算法流程的详细介绍,帮助工程师快速掌握VisionPro的应用技巧,提升工业自动化检测效率。

weixin_29284657的博客 518

java中的线程机制

一、创建线程的方法 1.继承Thread类 public class myThread extends Thread { public void run() { while(running) { code......//执行若干操作 sleep(100); } } public static void main(String args[])

buaa_shang的专栏 972

AUTOSAR从入门到精通-复杂设备驱动(CDD)

CDD是复杂设备驱动的首字母缩写主要为驱动程序或复杂驱动程序,但不限于驱动程序。复杂驱动程序是一种未被AUTOSAR标准化的软件实体,可以通过AUTOSAR接口和/或基本软件模块api访问。 CDD是位于基础软件复杂驱动层的特定模块,与标准BSW模块或Rte交互。 CDD可能需要与分层软件体系结构的模块连接 分层软件架构的模块可能需要连接到CDD CDD可能需要通过Rte连接swc。

getusushu的博客 4191

多线程——基础(生命周期、常用方法、优先级等)

文章目录概述1、多线程的4种创建方式2、线程锁机制简介3、多线程的生命周期4、常用方法—运行5、常用方法—线程休眠、等待与唤醒、让步6、常用方法—线程中断7、常用方法—等待线程结束8、常用方法—获取、设置9、线程优先级10、守护线程11、线程的状态12、线程本地变量13、并发集合14、线程内异常的传递 概述 在Java中,程序的运行可以笼统地分为两种方式:同步,异步。 假设我们在某个方法里,前后有两个子方法:method1、method2,现在想要执行完这两个子方法,按照同步、异步的方式,有以下两种执行过程

我的博客 954

凝聚态物理新引擎:AI 驱动材料预测与相变识别大突破

摘要:本文深入探讨 AI 在凝聚态物理中的创新应用。在材料性质预测方面,AI 借助数据收集、特征提取和模型训练,能依据材料微观信息准确预估其宏观性质,以石墨烯为例验证了高效性。对于拓扑相变识别,AI 通过分析量子力学数据,利用机器学习算法判别相变节点,助力拓扑绝缘体研究。尽管面临数据质量、模型可解释性等挑战,但未来多模态数据融合、可解释 AI 等发展方向,将推动 AI 与凝聚态物理深度融合,助力探索物质奥秘与新材料研发。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1825

手把手教你学simulink(69.3)--毫米波5G/6G 系统场景实例设计并实现基于Simulink的毫米波多用户MIMO通信系统模型

毫米波频段(30 GHz到300 GHz)因其高带宽和高速率特性,成为5G和未来6G通信系统的理想选择。然而,毫米波信号的传播特性较差,容易受到大气吸收、雨衰、建筑物遮挡等因素的影响。为了克服这些挑战并提高通信容量,多用户MIMO(MU-MIMO, Multi-User Multiple-Input Multiple-Output)技术被广泛应用。多用户MIMO技术通过在基站和多个用户之间同时传输多个数据流,充分利用空间资源,从而显著提升系统容量和频谱效率。

MHD0815的博客 493

Java 线程机制

1.进程是一个可执行的,一个运行的程序,是一个静态的概念。现在的操作系统支持多进程和多线程2.线程是一个进程中不同的执行路径,每个进程必须有一个主线程3.一个CPU,在同一个时间点上只能支持一个线程运行。4.多线程的真正含义是:系统是多CPU,多核处理器5.创建线程thread,启动线程。6有两种方式创建一个线程,继承thread类,实现runnable接口。

hongweideng的专栏 351

uniapp - 最新微信小程序手机号一键登录功能效果,uniapp小程序实现手机号码一键登录,uniapp微信小程序端通过手机号授权完成立即登录操作(详细示例源码,新手小白一键复制开箱即用)

uniapp,微信小程序,uniapp小程序平台,uniApp手机号一键登录,uniapp小程序端手机号一键登录功能,实现微信小程序手机号一键登录,在uniapp中实现获取手机一键登录功能,uniapp手机号快捷登录,uniapp微信小程序授权登录并获取手机号,微信小程序手机号快速验证组件调用方式,uniapp小程序怎么用手机号一键登录,uniapp一键登录流程及代码,如何获取手机号一键登录到小程序,微信小程序获取本机手机号一键登录功能,新手详细教程,详细手机一键登录完整示例代码,uni-app微信unia

✅ 精选推荐文章 1万+

Java并发(二):基本线程机制之再续前缘

Java并发(二):基本线程机制之再续前缘 此篇笔记为上一篇笔记:Java并发(一):并发的多面性与基本的线程机制前缘中,Java并发的基本线程机制的后续。 后台线程 所谓后台(daemon)线程,是指在程序运行的时候在后台提供的一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会kill掉进程中所有的后台线程。 必须在线程启动之...

weixin_38196407的博客 222

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java 线程的基本协作机制

这里写目录标题15.3 线程的基本协作机制15.3.1 协作的场景15.3.2 wait/notify15.3.3 生产者/消费者模式15.3.4 同时开始15.3.5 等待结束15.3.6 异步结果15.3.7 集合点15.3.8 小结参考目录 15.3 线程的基本协作机制        多线程之间除了竞争访问同一个资源外,也经常需要相互协作,怎 么协作呢?本节就来介绍Java中多线程协作的基本机制wait/notify。  

norang的博客 646

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java 基本线程机制

当一个程序进入内存运行时,即变成一个进程。进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。 独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己私有的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。 动态性:进程与程序的区别在于,程序只是一个静态...

菜鸟踩坑 919

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java线程基本概念与多线程协调机制探讨

可能排版存在问题,可以在下载PDF版。 1.线程的基本概念 进程为程序执行提供了环境(比如,内存,与操作系统的交互接口)。而线程则是进程中代码执行的基本单元,它为“进程”中的程序代码提供了执行环境,并因此能够对程序代码的执行状态进行查看和管控。进程中如果没有线程,那就没有办法执行代码。在Java中,进程、线程结构关系如下: 简而言之,线程的为代码运行提供了堆栈(stack),记录调用中的...

故道白云的博客 534

非常详细的JAVA并发基本线程机制

最详细的JAVA并发基本线程机制 编程问题中相当大的一部分都可以通过使用顺序编程来解决。然而对于某些问题,若果能够并发地执行程序中的多个部分,则会变得非常方便甚至非常必要,因为这些部分要么看起来在并发执行,要么在多处理器环境下可以同时执行。 JAVA是一种多线程语言,并提出了并发问题。实现并发最直接的方式是在操作系统级别使用进程。进程是运行在它自己的地址空间内的自包容程序。多任务操作系统可以通...

qq_44972915的博客 809

Java多线程编程基础一(基本线程机制、线程调度器、线程状态)

文章引用 1 java编程思想 21章 基本的线程机制 p653 2 http://www.jb51.net/article/105487.htm 3 https://zhidao.baidu.com/question/1542633956525518747.html 一、基本的线程机制 并发编程使我们可以讲程序划分为多个分离的、独立运行的任务。通过使用多线程...

DemoTransfer 323

java基本线程机制

基本线程机制方法一实现Runnable接口,编写run()方法,在里面描述了要做的事。class A implements Runnable{ public void run(){ // 编写任务脚本 } }注意:如果在main()方法里直接调用run()方法,它不由单独的线程驱动,而是分配给运行main()方法的那个线程,意味着如果多个实例依次调用run()方法,那

uDon的博客 411

java并发编程-基础概念、volatile、synchronized、CAS、ABA、线程、线程基本机制

目录 基础概念 关键字volatile 关键字synchronized cas:不加锁实现原子操作(乐观锁) cas中的ABA问题 线程 进程与线程的区别 java线程的实现方式 线程优先级 线程状态 Daemon线程 线程基本机制 中断Interrupted 等待/通知机制 管道输入/输出流 Thread对象的join()方法 线程局部变量ThreadL...

qq_40918961的博客 1695

Java并发(一):并发的多面性与基本的线程机制前缘

Java并发(一):并发的多面性与基本的线程机制 一、并发的多面性 并发编程令人困惑的一个主要原因是:使用并发时需要解决的问题有多个,而实现并发的方式也有多种,并且在这两者之间没有明显的映射关系(通常只具有模糊的界线)。 用并发解决的问题大体上可以分为“速度”和“设计可管理性”两种。 更快的执行 对于多处理器的机器,为了使程序运行得更快,并发赋予了利用额外处理器运行程序的能力。但是,并发通常是提...

weixin_38196407的博客 294

java 并发一 基本的线程机制

Executor executor是java5 concurrent包下的执行器提供管理Thread功能,如下例子 public class ThreadPool { private static int num = 0; public static void main(String[] args) { //创建线程池 ExecutorService e = Executor...

wangbo14511的博客 198

Java——线程的基本协作机制

简单总结一下,wait/notify方法看上去很简单,但往往难以理解wait等的到底是什么,而notify通知的又是什么,我们需要知道,它们被不同的线程调用,但共享相同的锁和条件等待队列(相同对象的synchronized代码块内)​,它们围绕一个共享的条件变量进行协作,这个条件变量是程序自己维护的,当条件不成立时,线程调用wait进入条件等待队列,另一个线程修改了条件变量后调用notify,调用wait的线程唤醒后需要重新检查条件变量。一个不带时间参数,表示无限期等待,实际就是调用wait(0)。

吴声子夜歌的博客 360

第九章 Java多线程机制 01_线程的基本概念

鱼欲遇雨:每日都学习一点,持之以恒,天道酬勤!不能用电脑时,提前补上!(2012.9.2) 本章内容 1   线程的基本概念 2   线程的创建和启动 3   线程的调度和优先级 4   线程的状态控制 5   线程的同步 线程的基本概念( 线程是一个程序里面不同的执行路径) 1   线程是一个程序内部的顺序控制流。 2   线程和进程的区别

jinhongliang123的专栏 571

java的多线程机制_Java多线程开发(一)| 基本的线程机制

0. 前言Java 为了实现跨平台,在语言层面上实现了多线程。我们只需要熟悉 Java 这一套多线程机制就行了,比 C/C++ 要容易多了。1. 定义任务我们编写程序,最终是为了完成特定的任务。为了更有效的利用系统资源,我们把任务合理地划分成多个子任务,放到多个线程中来执行。所以,首先我们需要一种描述任务的方式。在 Java 中,一般我们都用 Runable 接口来定义任务。public inte...

weixin_36254564的博客 240
上一篇: Java连接和操作数据库
下一篇: Java线程同步的实现
Al_assad
博客等级 码龄11年 591粉丝 341原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值