java多线程编程—高级主题_Java day20 高级编程【第一章】Java多线程编程

【第一章】Java多线程编程

一.进程与线程

多个时间段会有多个程序依次执行,但是同一时间点只有一个进程执行

线程是在进程基础之上划分的更小的程序单元 ,线程是在进程基础上创建并且使用的,所以线程依赖于进程的支持,但是来讲,线程的启动速度要比进程快许多,所以使用多线程进行并发处理的时候,执行的性能要高于进程。

二.Thread类实现多线程

如果想要在JAVA中实现多进程,就必须有一个专门的线程类进行线程执行任务的定义,而这个主体类的定义是有要求的,必须实现特定的接口或者继承特定的父类才可以完成。

1.继承Thread类实现多线程

java里面提供有一个java.lang.Thread的一个程序类,一个类只要继承了此类,并且覆写了Thread类中提供的run()方法,就表示这个类是线程的主体类,而这个方法就是线程的主方法。

范例:多线程主体类:

class Mythread extends Thread{ //线程主体类

privateString title;publicMythread(String title) {this.title =title;

}

@Overridepublic void run() { //线程主体方法

for (int x = 0; x<10;x++) {

System.out.println(this.title + "运行 x =" +x);

}

}

}

多线程要执行的功能都应该在run()方法中定义。需要说明的是,run方法不能够被直接调用,因为这里面牵扯到一个操作系统的资源调度问题

,所以要想启动多线程,必须使用start方法。

new Mythread("线程A").start();new Mythread("线程B").start();new Mythread("线程C").start();

在java程序执行的过程之中考虑到对于不同层次开发者的需求,所以支持有本地的操作系统函数调用,这个技术被称为JNI(Java Native Interface Java本地接口)技术,而java中不推荐这样使用。

而在Thread类里提供的start0()就表示需要将此方法依赖于不同的操作系统实现。

public synchronized voidstart() {if (threadStatus != 0)throw newIllegalThreadStateException();

group.add(this);boolean started = false;try{

start0();

started= true;

}finally{try{if (!started) {

group.threadStartFailed(this);

}

}catch(Throwable ignore) {

}

}

}private native void start0();

疑问:为什么必须使用start而不能使用run方法:

4e33cc10d42101d7d5dd6c3617395600.png

任何情况下只要定义了多线程,多线程的启动永远只有一种方案:Thread类中的start方法。

三.Runnable接口实现多线程

虽然可以通过Thread类的继承来实现多线程的定义,但是在java程序中对于继承永远都是存在有单继承局限的,所以在java又提供了第二种多线程的主体定义形式:

实现java.lang.Runnable,此接口定义如下:

@FunctionalInterfacepublic voidRunnable() {public voidrun();

}

范例:通过Runnable实现多线程(Thread​(Runnable target)):

class Mythread implements Runnable{ //线程主体类

privateString title;publicMythread(String title) {this.title =title;

}

@Overridepublic void run() { //线程主体方法

for (int x = 0; x<10;x++) {

System.out.println(this.title + "运行 x =" +x);

}

}

}public classThreadDemo {public static voidmain(String[] args) {

Thread threada= new Thread(new Mythread("线程对象A"));

Thread threadb= new Thread(new Mythread("线程对象B"));

Thread threadc= new Thread(new Mythread("线程对象C"));

threada.start();

threadb.start();

threadc.start();

}

由于此时只是实现了Runnable接口对象,此时线程主体就不再有单继承的局限,这样的设计才是标准的设计。

Runnable接口使用了函数式接口的定义,所以也可以直接使用Lambda表达式进行线程类实现。

范例:利用Lambda实现多线程定义:

public classThreadDemo {public static voidmain(String[] args) {for(int x = 0 ;x < 3 ; x++) {

String title= "线程对象-" +x;

Runnable run= ()->{for(int y = 0; y < 3 ; y++) {

System.out.println(title+ "运行 x =" +x);

}

};newThread(run).start();

}

}

}

在以后开发之中对于对线程的实现,优先考虑的就是Runnable接口实现,并且都是通过Thread启动多线程

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

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

相关文章

java object数组转实体类_详解Java中String JSONObject JSONArray List实体类转换

JSON使用阿里的fastJson为依赖包gradle依赖管理如下&#xff1a;compile group: "com.alibaba", name: "fastjson", version:"1.2.41"1、String转JSONObject前言&#xff1a;String 是JSONObject格式的字符串eg:JSONObject jSONObject JSONObje…

e x泰勒 java_maven project

最近没事了玩一下maven&#xff0c;使用maven管理工程中的依赖包非常的方便。建立maven web工程的时候开始不知道怎么用tomcat来调试&#xff0c;总是使用mave的tomcat插件发布了后来调试&#xff0c;觉得非常的麻烦&#xff0c;网上找了点材料&#xff0c;看看maven web工程不…

java定义说话方法_类定义的基本形式_Java语言程

类定义的基本形式_Java语言程4&#xff0e;2&#xff0e;1 类定义的基本形式前面一节我们已经了解了类和对象的概念&#xff0c;然而在实际编程过程中&#xff0c;该如何定义一个类以及类中的对象呢&#xff1f;在Java语言中&#xff0c;用户自己可以定义一个类&#xff0c;作…

java创建线程几种_java中创建线程有几种方式

详细内容线程的创建方式1、继承Thread类实现多线程2、覆写Runnable()接口实现多线程&#xff0c;而后同样覆写run()。推荐此方式3、使用Callable和Future创建线程相关视频教程推荐&#xff1a;java学习视频实例如下&#xff1a;1、继承Thread类实现多线程/** 继承Thread类创建线…

php自定义中文分词方法,php实现的中文分词类完整实例

本文实例讲述了php实现的中文分词类。分享给大家供大家参考&#xff0c;具体如下&#xff1a;该中文分词类源码使用http://tools.ddpool.cn/code/jb51_php_format进行了格式化处理&#xff0c;便于阅读。具体代码如下&#xff1a;class Segmentation {var $options array(lowe…

手机电脑自适应导航源码php,自适应各终端懒人网址导航源码 v2.0

自适应各终端懒人网址导航源码。V2.0版本是在原1.8版本的基础上修复和增加了些功能。推荐直接使用新版本&#xff0c;舍弃旧版本&#xff0c;后期会继续不定期更新。测试环境&#xff1a;宝塔Nginx -Tengine2.2.3的php5.5mysql先导入数据库文件db/db.sql再修改config.php数据库…

php如何生成本地文档,php如何生成word文件

php生成word文件的方法&#xff1a;需求&#xff1a;甲方爸爸说“我有一个word文件&#xff0c;里面是关于用户信息的表格&#xff0c;你帮我把系统里面所有用户数据都按照这个文件导出来给我“&#xff1b;我当时就不乐意了&#xff0c;啪的一拍桌子站起来&#xff0c;愤愤的回…

php 显示状态,php-fpm status状态配置显示

系统为ubuntu,在usr/etc/sites-enabled/中编辑nginx配置文件server_name demo.com;location ~^/status$ {#auth_basic "status page";#fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;include fastcgi_params;fastcgi_pass unix:/var/…

matlab 动态目录调用程序集,C#中如何动态添加程序集查找目录

C#中如何动态添加程序集查找目录情况如下&#xff1a;现有三个程序集Main.exe, One.dll, Two.dll。其中One.dll引用了Two.dll&#xff0c; 并且One.dll与Two.dll部署在一起, 而Main.exe单独部署。在One.dll中有using Two;namespace One{public SomeType{public void DoSomethin…

matlab 红黑强度图片,matlab图形锐化程序

满意答案gveial5852013.10.31采纳率&#xff1a;50% 等级&#xff1a;12已帮助&#xff1a;11498人help imreadhelp fspecial imfilt帮助稳定中有较多的示例fspecial 函数功能&#xff1a;产生预定义滤波器格式&#xff1a;Hfspecial(type)Hfspecial(gaussian,n,sigma) 高斯…

php基础学哪些,榆林学习php需要哪些基础(PHP是什么)

榆林学习php需要哪些基础&#xff0c;想多学一门知识&#xff0c;陕西PHP培训对我们都是大有裨益的&#xff0c;紧接着就去了解下php代码运行方式有哪些&#xff0c;php常用框架有哪些&#xff0c;php为啥遭到它行鄙视&#xff0c;PHP是什么&#xff0c;php的性质有哪些&#x…

oracle 11gr2 asm安装,OEL6.1下oracle 11gr2 ASM安装

oracle 11gr2下asm与以往不同&#xff0c;是使用grid安装包来完成安装与配置&#xff0c;在11.2.0.3的安装包中&#xff0c;使用第三个安装包&#xff0c;解压以后进行以下配置&#xff1a;1. Asm相关用户及组配置/usr/sbin/groupadd -g 502 oper/usr/sbin/groupadd -g 600 asm…

oracle 12配置安全与更新,Oracle 12c 数据库安全核心技术讨论

Oracle AdvancedSecurity新功能 >Oracle Data RedactionOracle Data Redaction对应用户权限的实时访问控制根据用户的权限以及客户端信息&#xff0c;Redaction实时数据修正应用代码代表在不必要的数据库中完成列访问的控制根据客服中心以及技术支持的职责不同&#xff0c;对…

oracle11gR版本GI中新增,Oracle11g新特性MemberKillEscalation简介

从oracle 11gR1 开始&#xff0c;Member Kill Escalation的出现成功的解决了前面提到的情况。当实例eviction在指定的时间内(默认20秒)不能首先我们介绍一下历史。在Oracle 9i/10g 中&#xff0c;如果一个数据库实例需要驱逐(evict, alert 文件中会出现ora-29740错误)另一个实例…

linux命令为什么这么快,为什么这么多Linux用户更喜欢命令行而不是GUI?

为什么这么多 Linux 用户更喜欢 CLI 而非 GUI&#xff1f; 上次我在 Reddit 关注该问题时&#xff0c;遇到了一些有帮助的投稿&#xff1a;“处于相同的原因我更喜欢谈论指指点点和七嘴八舌。 可以很好的传达并给出很好的反馈。这不是一团糟&#xff0c;而是富有诗意的精确。 你…

mac os linux 桌面快捷键,Mac之快捷键

接触Mac不久&#xff0c;很多东西都没了解过&#xff0c;对于快捷键完全不熟悉&#xff0c;查了些资料&#xff0c;顺便做下笔记&#xff5e;&#xff5e;&#xff5e;按键符号Shift&#xff1a;⇧Ctrl&#xff1a;⌃Alt(Option)&#xff1a;⌥Command&#xff1a;⌘Mac按键符号…

linux 等待进程,Linux 进程等待队列

Linux内核的等待队列是以双循环链表为基础数据结构&#xff0c;与进程调度机制紧密结合&#xff0c;能够用于实现核心的异步事件通知机制。在这个链表中&#xff0c;有两种数据结构&#xff1a;等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列…

linux启动管理,Linux启动管理 详述

一 系统运行级别如果想查看运行级别&#xff0c;用runlevelinit 运行级别 就可以改变系统运行级别系统默认级别&#xff0c;也就是开机进入哪个级别&#xff0c;在/etc/inittab中二 启动过程首先是BIOS加载MBR&#xff0c;MBR里有个扇区&#xff0c;里面有启动引导程序&#xf…

linux vfs 根节点名称,Linux:文件,目录项,索引节点,超级块,VFS,具体文件系统...

【笔记&#xff1a;http://m.blog.csdn.net/blog/zhouzhou135】在了解文件系统之前&#xff0c;先了解磁盘格式化的知识。所以要理解文件系统的数据结构&#xff0c;要从两个方向来理解&#xff1a;1&#xff1a;磁盘中的数据结构&#xff1a;因为在磁盘格式化的时候&#xff0…

存储器块清零c语言版,存储器块清零实验报告

有关单片机存储器块清零实验的试验报告存储器块清零实验报告班级&#xff1a; 11级计科班 姓名&#xff1a;苏靖 学号&#xff1a;1120070544 日期&#xff1a;2012-12-19一、实验目的&#xff1a;1、掌握存储器读写方法2、了解存储器的块操作方法.二、实验要求&#xff1a; 设…