Java线程问题 看完这篇就够了
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、进程是什么?
- 二、线程是什么?
- 三、线程和进程区别是什么?
- 四、串行,并行,并发的区别
- 五、线程实现的几种方法
- 1.继承Tread
- 2.实现Runnable接口
- 3.通过匿名内部类和Lamda表达式来实现 (也是通过继承类实现和实现)
- 4、实现callable接口
- 5、通过创建线程池的方法来创建线程
- 创建线程的方总结
- 线程的生命周期
- 线程常用方法
- 线程小案例
- 题目一
- 题目二
- 题目三
- 题目四
- 总结
一、进程是什么?
在学习线程之前,我们先来谈谈进程 首先进程是什么 ?
进程是程序相关资源的时候分配的最小单位,每一个进程是独立的都有自己的内存 一个进程室友多个线程组成
二、线程是什么?
线程是cpu分配的最小单元,或者cpu调度时分配的最小单元
线程需要资源更少 可以看做一个轻量级的进程
线程会共享进程的,线程有独立的空间(栈,程序)
线程同信更方便
三、线程和进程区别是什么?
线程是程序执行时分配的最小单元
而进程则是操作系统资分配的最小单位
一个线程会共享进程中的内存 而线程有自己的独立的空间
四、串行,并行,并发的区别
在说他们的区别之前先说说他们是什么
串行:多个指令依次执行,所有的指令一条一条执行的
并发:每一个线程单独一段指令,cpu在线程中进行切换(并不是同时执行)
并行:多个cpu内核同时执行多个线程
总结:在线程中单核 在宏观上是并行 在微观上是串行。而并行由于现在计算机高速发展可以有多核存在 所以可以多个线程同时进行 就是并行的区别
五、线程实现的几种方法
1.继承Tread
1 第一步继承类
2重写run方法
3 通过线程start方法来开启线程
package com.test.demo.entity.test;
// 通过继承Thread类
public class ThreadOne extends Thread {//重写run()方法@Overridepublic void run() {System.out.println("今天跟金风大人学线程");}
//main方法执行public static void main(String[] args) {//创建线程oneThreadOne one=new ThreadOne();//通过start方法one.start();}
}执行效果:今天跟金风大人学线程
2.实现Runnable接口
主要步骤
1先让一个实体类实现Runnabe接口
2.实现Runnable接口之后就要重写run方法
3创建一个实现Runnable接口的对象传给Thread
4.创建Thread对象 执行 start方法开启线程
package com.test.demo.entity.test;/*** 实现Runnable接口*/
public class ThreadOne implements Runnable {//主方法public static void main(String[] args) {//创建一个实现Rnnable接口对象ThreadOne one=new ThreadOne();//将实现Runnable接口对象传给ThreadThread thread = new Thread(one);//开启线程thread.start();}
//实现run方法@Overridepublic void run() {System.out.println("金风大人教线程");}
}执行效果:今天跟金风大人学线程
3.通过匿名内部类和Lamda表达式来实现 (也是通过继承类实现和实现)
/*** 用lamda表达式和函数式接口来实现*/
public class ThreadOne {public static void main(String[] args) {//创建一个Thread对象,通过函数式接口来实现Thread thread = new Thread(()->{System.out.println("金风大人教线程");});thread.start();//通过匿名内部类进行使用Thread thread1=new Thread(new Runnable() {@Overridepublic void run() {System.out.println("金风大人教线程");}});thread1.start();}
}执行结果
金风大人教线程
金风大人教线程
4、实现callable接口
1.创建一个类实现callable接口对象
2.实现接口里面的方法 call方法体里面写线程要执行代码,可以设置返回值
3.创建一个FutureTask对象 ,用来接收返回值,并且传入参数 是实现这个Callable接口的对象
4.创建一个Thread对象 然后在将FutureTask对象传入进去
5.通过调用FuntureTask对象的get方法来得到返回结果
代码如下(示例):
public class ThreadOne implements Callable {public static void main(String[] args) throws Exception {//创建一个实现了Callable接口的实体类ThreadOne one = new ThreadOne();//创建FutureTask对象用来接收执行开启线程后的值FutureTask futureTask = new FutureTask(one);//创建一个线程将FutureTask的对象传个线程Thread tread = new Thread(futureTask);//开启线程tread.start();//可以得到线程的值System.out.println(futureTask.get());}
//实现Callable接口实现call()方法@Overridepublic Object call() throws Exception {System.out.println("各位看官大人好");return "金风大人教你们学线程";}
}
5、通过创建线程池的方法来创建线程
1.创建线程池
2.将一个线程加入到线程池里面去
data = pd.read_csv(package com.test.demo.entity.test;
import java.util.concurrent.*;public class ThreadOne {public static void main(String[] args) throws Exception {//创建线程池 这个线程池长度不限制ExecutorService service= Executors.newCachedThreadPool();//创建线程池 线程池长度设置为5ExecutorService service1= Executors.newFixedThreadPool(5);//直接开启线程运行for (int i=0;i<50;i++){//放进线程池里面去 通过execute()方法service.execute(()->{System.out.println(Thread.currentThread().getName());});}}}
创建线程的方总结
一共四种方法
第一种直接继承Thread
第二种直接实现Runnable
第三种直接实现Callable接口
第四种 线程池
第一种和第二种没有返回值
它们之间的区别是Thread需要继承 由于Java单继承的缘故
所以会导致继承了Thread之后不能继承其他的类
而实现Runnable 接口就不需要考虑这个问题
一般推荐使用实现Runnable接口
而第三种实现Callable接口的区别124都没有返回值而他有返回值可以通过FuntrueTas的get方法进行实现
第四种用线程池可以将线程重复使用降低了资源消耗 提高响应速度 创建好的线程可重复使用 而且提高了他的可管理性
线程的生命周期
线程一共有五个生命周期
分别是 新建new 就绪状态 Ready Running运行状态 blocked阻塞状态 terminated终止状态
线程常用方法
方法名 | 作用 |
---|---|
start | 启动线程 |
stop | 停止线程 禁用 可能出现死锁问题 |
getName | 得到线程名 |
setName | 更改线程名 |
sleep(毫秒) | 睡眠,毫秒 |
setPriority | 设置优先级(1到10级) |
setDaemon(true) | 设置后台线程,案例GC |
jion() | 插队 |
线程小案例
题目一
- 设计两个线程,一个线程负责打印1~100以内所有的偶数;然后,另外一个线程负责打印1到100以内所有的奇数。测试时,分别设置线程的优先级,观察执行的顺序
package com.test.demo.entity.homework1;/*** 1. 设计两个线程,一个线程负责打印1~100以内所有的偶数;然后,另外一个线程负责打印1~100以内所有的奇数。*测试时,分别设置线程的优先级,观察执行的顺序* @金风大人*/
public class ThreadOne {public static void main(String[] args) {Thread thread = new Thread(() -> {for (int i = 0; i <= 100; i++) {if (i % 2 == 0) {System.out.println(Thread.currentThread().getName()+"-->"+i);}}});Thread thread1 = new Thread(() -> {for (int i = 0; i <= 100; i++) {if (i % 2 != 0) {System.out.println(Thread.currentThread().getName()+"-->"+i);}}});thread.start();thread1.start();thread1.setPriority(10);}
}
题目二
- 实现一个线程,用于扫描某个目录下的所有文本文件(包括:java、txt、html),并将文字内容打印出来。
package com.test.demo.entity.homework2;import java.io.*;public class WorkTwo {public static void copy(String path){File file = new File(path);File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {if (!files[i].isDirectory()) {System.out.println();try (InputStream inputStream = new FileInputStream(files[i].getAbsolutePath())) {int length = 0;byte[] bs = new byte[1024];while ((length = inputStream.read(bs)) != -1) {String str = new String(bs, 0, length, "utf-8");System.out.println(str);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}else {copy(files[i].getAbsolutePath());}}}public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {copy("C:\\thread");}}).start();}
}
题目三
3.某人正在看电视连续剧,从第1~88集,看到第10集时,来了一个送快递的,收完快递后后,继续看电视。
package com.test.demo.entity.homework3;/*** 某人正在看电视连续剧,从第1~88集,看到第10集时,来了一个送快递的,收完快递后后,继续看电视。*/
public class ThreadTree {static Thread thread;static Thread thread1;public static void main(String[] args) {thread = new Thread(() -> {for (int num = 0; num <= 88; num++) {System.out.println("邓颖看电视第" + num + "级");if (num == 20) {try {thread1.start();thread1.join();} catch (InterruptedException e) {e.printStackTrace();}}}});thread1 = new Thread(() -> {for (int i = 0; i < 10; i++) {System.out.println("正在送快递");}});thread.start();}}
题目四
- 多线程模拟龟兔赛跑:
乌龟和兔子进行1000米赛跑,兔子前进5米,乌龟只能前进1米。
但兔子每20米要休息500毫秒,而乌龟是每100米休息500毫秒。
谁先到终点就结束程序,并显示获胜方
package com.test.demo.entity.homework4;public class ThreadFour {static Thread rabbit;static Thread turtle;public static void main(String[] args) {rabbit = new Thread(() -> {for (int i = 0; i <= 1000; i += 5) {System.out.println("兔子开始跑步=" + i);if (i % 20 == 0 && i != 0) {if (i==1000){System.out.println("兔子赢");System.exit(0);}try {rabbit.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}});turtle = new Thread(() -> {for (int y = 0; y <= 1000; y += 1) {System.out.println("乌龟开始跑步=" + y);if (y % 100 == 0 && y != 0) {if (y==1000){System.out.println("乌龟赢了");System.exit(0);}try {turtle.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}});rabbit.start();turtle.start();}
}
总结
今天金风大人已经讲完了基本的线程知识 对于线程当然这远远不够 我也只是简单的介绍了线程的一些知识 关于后续的线程知识移步到我的个人博客里 关于线程他是cpu调度的基本的最小单位
Java线程问题 看完这篇就够了相关推荐
- docker 删除所有镜像_关于 Docker 镜像的操作,看完这篇就够啦 !(下)| 文末福利...
紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...
- 【系统架构设计师】软考高级职称,一次通过,倾尽所有,看完这篇就够了,论软件架构设计的重要性、本篇论文“未通过考试”,供分析参考
[系统架构设计师]软考高级职称,一次通过,倾尽所有,看完这篇就够了,学习方法和技巧这里全都有. 论软件架构设计的重要性.本篇论文未通过考试(不合格),供分析参考. 目录 摘要 正文 结尾 摘要 201 ...
- 【系统架构设计师】软考高级职称,一次通过,倾尽所有,看完这篇就够了,方法和技巧这里全都有。
目录 背景 报考条件 通过率 考试时间要求 系统架构设计师考试内容 证书的价值 备考建议 报班&自学 分享下我的自学方法 必胜法宝 分享我考试的心态 [系统架构设计师]软考高级职称,一次通过, ...
- 计算机基础ip地址私有地址,关于ip地址的详解,看完这篇就够了
原标题:关于ip地址的详解,看完这篇就够了 前天我们发布了什么是公网ip?什么是内网ip?为什么ip地址通常以192.168开头?,有朋友反映有没有更基础的,那我们就从ip地址开始说起. 一.特殊的I ...
- PHP电子合同对接流程,企业如何API对接云合同电子合同系统,看完这篇就够了
自有系统要怎样对接电子签名系统? 电子合同管理在哪个平台操作? 合同签署怎么完成? 看完这篇就够了 多种方案,系统与平台无缝对接 不管是供应链.人力资源.互联网金融还是大型企业,大部分平台都有自己的业 ...
- Java 集合框架看这一篇就够了
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:都说了多少遍,不要再学 JSP 了!个人原创100W+访问量博客:点击前往,查看更多 话不多说,直接上图: Ja ...
- 黑客零基础入门教程,从入门到精通学习路线规划,看完这篇就够了。
很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习,最终也只是会无疾而终!黑客是一个大的概念,里面包含了许多方向,不同的方向需要学习的内容也不一样. 想要成为黑客,却苦于没有方向,不知道从何学起 ...
- 不必东奔西走,Java 集合框架看这一篇就够了
Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的:Collection 和 Map 顾名思义,容器就是用来存放数据的. 那么这两大接口的不同之处在于: Collecti ...
- web开发中的长度单位(px,em,ex,rem),如何运用,看完这篇就够了!
原创 2017-03-08 web小二 web前端开发 作为一名前端开发人员,css中的长度单位,都是我们在工作中非常熟悉的名词,因为没有它们,我们就不能声明某个字符应该多大,或者某些图像周围应该留白 ...
最新文章
- wfs.js 多路视频 串屏 闪烁
- 创建linux目录,Linux目录的创建方法
- python创建txt文件
- python 可变 与 不可变类型
- argsort()返回数据从小到大的“索引值”
- 信安 | 网上吵个架都能被封号?是“黑科技”还是“黑产”?
- shell 判断字符串是否存在包含关系
- 动态规划——骨牌平铺问题
- 程序员如何看待实力与运气
- Go Anywhere Chair
- 全新的福昕JavaScript PDF阅读器
- python春节对客流量的影响_春节对经济的影响
- 有道智选-网易效果推广
- 如何处理u盘一插进电脑就自动打开里面的所有文件夹
- 中英文翻译功能 php,PHP微信开发之翻译功能
- Visial Studio中“变量已被优化掉 因而不可用”的解决方案
- SpringCloud系列【security oauth2】
- 数组排序(O(n的二次方))
- 计算机培训艺术字体,Word2019中使用艺术字,设置文字倒置
- 计算机发展变化初三英语作文,初三我的变化英语作文
热门文章
- 安卓文件浏览器ftp服务器地址,安卓文件浏览器ftp服务器
- Win10以管理员的身份登录到Windows,创建新的用户的方法,手把手超详细,亲测有效
- 毕业新生找工作面试有哪些需要注意?
- html如何设置div的边框颜色
- python实现excel函数_python操作excel
- 华为荣耀服务器浏览网页卡,华为荣耀6PLUS手机信号很好但是网速很慢的解决办法...
- 《极简主义》思维导图
- strcasecmp详解
- oracle 11g b表空间什么情况下自动增加,oracle 11g 查看表空间使用情况,表空间创建,表空间添加数据文件,修改数据文件自动增长,删除表空间...
- 软件测试工作流程总结