Thread线程类及多线程

1.进程、线程、并发、并行是什么?

1)进程:操作系统中可以运行多个任务(程序),这些运行的任务(程序)被称为进程。程序的运行产生进程(内存空间、程序执行的堆栈),可以这样说,进程是作为操作系统分配资源的基本单位。

2)线程:程序里同时可能运行多个任务(在一个CPU时间片内,顺序执行流),那么每个任务(顺序执行流)就叫做一个线程,即在线程内部。

3)并发:线程是并发运行的。操作系统将时间化分为若干个片段(时间片),尽可能的均匀分配给每一个任务,被分配时间片后,任务就有机会被cpu所执行。微观上看,每个任务都是走走停停的。但随着cpu高效的运行,宏观上看所有任务都在运行这种都运行的现象称之为并发,但不是绝对意义上的“同时发生”。

 4)并行:一个时间段,多个任务同时进行,而且多个CPU运行各自的进程。

 2.多线程的实现

1)继承Thread

 通过查阅JDK API文档,Thread 类位于java.lang中,表示进程中的执行线程。实现多线程有两种方式。第一是继承Thread:

 1 package cn.a1.a;
 2 
 3 public class MyThread extends Thread {
 4 
 5     @Override
 6     public void run() {
 7         System.out.println("这是多线程MyThread");
 8         for (int i = 0; i < 5; i++) {
 9             System.out.println("MyThread:" + i);
10         }
11 
12     }
13 }
 1 package cn.a1.a;
 2 
 3 public class Test1 {
 4     public static void main(String[] args) {
 5         // 创建一个多线程,此时已有两个线程 主线程(main) 和 创建的线程 mThread1;
 6         MyThread mThread1 = new MyThread();
 7         mThread1.start();
 8 
 9         // 查看主线程main是否运行
10         for (int i = 0; i < 5; i++) {
11             System.out.println("main Thread:" + i);
12         }
13 
14     }
15 
16 }

main线程和t1线程抢占CPU 执行,输出也是main线程和t1线程根据内部抢占CPU 执行输出,不规则,多线程在提高CPU利用率的同时,增加程序的复杂度。

main Thread:0
这是多线程MyThread
main Thread:1
MyThread:0
main Thread:2
MyThread:1
main Thread:3
MyThread:2
MyThread:3
main Thread:4
MyThread:4

 

2)实现Runnable接口

用于定义线程要执行的任务逻辑。我们定一个类实现Runnable接口,这时我们必须重写run方法,在其中定义我们要执行的逻辑。之后将Runnable交给线程去执行。从而实现了线程与其执行的任务分离开。将任务分别交给不同的线程并发处理,可以使用线程的重载构造方法:Thread(Runnable runnable)。解藕:线程与线程体解藕,即打断依赖关系。 如果你学到Spring了就知道,Spring的ioc就是干这个的。

 演示:

 1 package cn.a1.a1;
 2 
 3 public class MyRun implements Runnable {
 4 
 5     @Override
 6     public void run() {
 7         System.out.println("这是MyRun");
 8         
 9         for (int i = 0; i < 3; i++) {
10             System.out.println("MyRun:" + i);
11         }
12     }
13 }

 

 1 public class Test1 {
 2     public static void main(String[] args) {
 3         MyRun tRun1  = new MyRun();
 4         Thread t1 = new Thread(tRun1);
 5         t1.start();
 6         //这里main开始运行也有产生一个进程,该进程有个主(main)线程
 7         for (int i = 0; i < 3; i++) {
 8             System.out.println("main"+i);
 9         }
10         
11     }
12 
13 }

输出不规则的

main0
这是MyRun
MyRun:0
main1
main2
MyRun:1
MyRun:2

继承Thread和实现Runnable接口实现多线程的优缺点

[1] 继承Thread的线程类不能再继承其他类,实现Runnable接口的类还可以继承其他类。

[2] 实现Runnable接口的线程类,可以让多个线程共享线程实现类的资源

总结:

多线程提高了cpu利用率,但程序的复杂度也随之增加。一旦线程开始执行,很难通过其他方式控制线程的轨迹。

多个线程抢占CPU导致线程的运行轨迹不确定。

转载于:https://www.cnblogs.com/abcdjava/p/10840670.html

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

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

相关文章

绛河 初识WCF5

然后我们在<Client>中添加一个终结点&#xff0c;这个是客户端的终结点&#xff0c;我们前面曾经提过&#xff0c;通信实际上发生在两个终结点间&#xff0c;客户端也有个终结点&#xff0c;然而请求总是从客户端首先发起&#xff0c;所以终结点地址应该填写为服务端终结…

python修炼第四天

今天换了师傅。江湖人称景女神^o^。 女师傅讲的比较细&#xff0c;原理的比较多。初学者来说有些难。但是基本功是必须要打牢的。努力&#xff01; 迭代器 迭代器&#xff0c;迭代的工具1 什么是迭代&#xff0c;指的是一个重复的过程&#xff0c;每一次重复称为一次迭代&#…

尴尬的存储过程

最近在给一个已沉淀了多年的系统框架进行优化&#xff0c;发现大部分的基础业务&#xff08;比如增删改&#xff09;的实现都是通过存储过程来实现。这让我纠结了很久&#xff0c;看了下代码格式我猜应该都是使用了代码生成器。这无疑为系统的扩展留下了一个难以弥补的大坑。 首…

java虚拟机06-内存分区/新生代、老年代

1.原因 JVM在程序运行过程当中&#xff0c;会创建大量的对象&#xff0c;这些对象&#xff0c;大部分是短周期的对象&#xff0c;小部分是长周期的对象&#xff0c;对于短周期的对象&#xff0c;需要频繁地进行垃圾回收以保证无用对象尽早被释放掉&#xff0c;对于长周期对象&a…

博客作业04--树

1.学习总结(2分) 1.1树结构思维导图 1.2 树结构学习体会 树这一章节比较复杂&#xff0c;知识点繁多&#xff0c;结合了递归的知识所以代码阅读起来会有障碍&#xff0c;难以理解&#xff0c;所以学起来比较吃力&#xff0c;而且很多经典的算法理解的不是很透彻解决pta上的问题…

Centos 配置多个虚拟IP

Centos 配置多个虚拟IP 临时设置 ifconfig enp2s0:3 192.168.3.152 netmask 255.255.255.0 up 复制代码永久生效 TYPEEthernet BOOTPROTOnone NAMEenp2s0 DEVICEenp2s0 HWADDR40:8d:5c:bc:f4:d8 ONBOOTyes IPADDR0192.168.3.200 PREFIX024 GATEWAY0192.168.3.254 IPADDR1192.16…

[转]MySQL日志——Undo | Redo

本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性&#xff0c;在MySQL数据库InnoDB存储引擎中&#xff0c;还用Undo Log来实现多版本并发控制(简称&#xff1a;MVCC)。 - 事务的原子性(Atomicity) 事务中的所有操作&#xff0…

Vim操作指南

vim具有6种基本模式和5种派生模式。 基本模式 普通模式 插入模式 可视模式 选择模式 命令行模式 Ex模式 派生模式 操作符等待模式 插入普通模式 插入可视模式 插入选择模式 替换模式 1.移动光标&#xff08;普通模式下&#xff09; h&#xff1a;左 j&#xff1a;下 …

[DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料

首先我想吐槽的是题目并没有表明数据范围。。。 这个题目 DP方程并不难表示。 dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] dp[i-1][k] (j-k) * cost j*j*(leng[i]-leng[i-1]) 如果你这样直接提交上去&#xff0c;恭喜你超时&#xff01;&#xff01;&#xff0…

十天冲刺09

今天&#xff0c;和小伙伴在做密保功能的开发&#xff0c;而且通过密保可以找回用户密码。转载于:https://www.cnblogs.com/Excusezuo/p/10923690.html

hdu 6168 Numbers

zk has n numbers a1,a2,...,an. For each (i,j) satisfying 1≤i<j≤n, zk generates a new number (aiaj). These new numbers could make up a new sequence b1&#xff0c;b2,...,bn(n−1)/2 . LsF wants to make some trouble. While zk is sleeping, Lsf mixed up seq…

039_MySQL_多表查询

#创建部门 CREATE TABLE IF NOT EXISTS dept (did int not null auto_increment PRIMARY KEY,dname VARCHAR(50) not null COMMENT 部门名称 )ENGINEINNODB DEFAULT charset utf8;#添加部门数据 INSERT INTO dept VALUES (1, 教学部); INSERT INTO dept VALUES (2, 销售部); IN…

sqlserver 创建对某个存储过程执行情况的跟踪

有时候需要抓取执行存储过程时某个参数的值&#xff0c;有时候程序调用存储过程执行后结果不太对&#xff0c;不确定是程序的问题还是存储过程的问题&#xff0c;需要单独执行存储过程看结果 即可用下面的方法 -- --创建对某个存储过程的执行情况的跟踪 --注意修改路径 和 obje…

5.7 弹性盒子

弹性盒子定义弹性盒子 display&#xff1a;flex定义子元素排列方式 flex-diection定义子元素换行方式 flxe-wrap定义子元素对齐方式横向对齐 justify-content纵向对齐 align-items 媒体查询 media screen and (max-width:最大宽度)and &#xff08;min-width&#xff1a;最小…

4.navicat11激活教程,亲测可用哦!

原文地址&#xff1a;http://blog.csdn.net/sanbingyutuoniao123/article/details/52589678Navicat是一款数据库管理工具, 用于简化, 开发和管理MySQL, SQL Server, SQLite, Oracle 和 PostgreSQL 的数据库&#xff1b;Navicat数据模型工具以图形化方式创建关联式数据库&#x…

汉诺塔问题深度剖析(python实现)

当我们学习一门编程语言的时候&#xff0c;都会遇到递归函数这个问题。而学习递归的一个经典案例就是汉诺塔问题。通过这篇文章&#xff0c;观察移动三个盘子和四个盘子的详细过程&#xff0c;您不仅可以深刻的了解递归&#xff0c;也更加熟悉了汉诺塔的游戏的玩法。 更好的阅读…

iOS-QQ临时对话、QQ群申请跳转

QQ 临时对话 NSString *qq [NSString stringWithFormat:"mqq://im/chat?chat_typewpa&uin%&&version1&src_typeweb","这是是QQ号码"];NSURL *urlQQ [NSURL URLWithString:qq];[[UIApplication sharedApplication] openURL:urlQQ]; QQ 申…

[luoguP2331] [SCOI2005]最大子矩阵(DP)

传送门 orz不会做。。。 一个好理解的做法&#xff08;n^3*k&#xff09;&#xff1a; 分n1和n2两种情况考虑。 n1时&#xff0c;预处理出前缀和sum[]。 设f[i][j]为到达第i格&#xff0c;已经放了j个子矩阵的最大和&#xff0c; 那么每次先把f[i][j]的值设为f[i-1][j]&#xf…

想要去阿里面试?你必须得跨过 JVM 这道坎!

概述 很多人想要到阿里巴巴、美团、京东等互联网大公司去面试&#xff0c;但是现在互联网大厂面试一般都必定会考核JVM相关的知识积累和实践经验&#xff0c;毕竟线上系统写好代码部署之后&#xff0c;每个工程师都必须关注JVM相关的东西&#xff0c;比如OOM、GC等问题. 所以一…

医学知识图谱一

大纲 知识自动提取技术 医学知识融合 医学知识推理 转载于:https://www.cnblogs.com/quietwalk/p/9000950.html