提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、进程是什么?
    • 二、线程是什么?
  • 三、线程和进程区别是什么?
  • 四、串行,并行,并发的区别
  • 五、线程实现的几种方法
      • 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. 设计两个线程,一个线程负责打印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);}
}

题目二

  1. 实现一个线程,用于扫描某个目录下的所有文本文件(包括: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();}}

题目四

  1. 多线程模拟龟兔赛跑:

​ 乌龟和兔子进行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线程问题 看完这篇就够了相关推荐

  1. docker 删除所有镜像_关于 Docker 镜像的操作,看完这篇就够啦 !(下)| 文末福利...

    紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...

  2. 【系统架构设计师】软考高级职称,一次通过,倾尽所有,看完这篇就够了,论软件架构设计的重要性、本篇论文“未通过考试”,供分析参考

    [系统架构设计师]软考高级职称,一次通过,倾尽所有,看完这篇就够了,学习方法和技巧这里全都有. 论软件架构设计的重要性.本篇论文未通过考试(不合格),供分析参考. 目录 摘要 正文 结尾 摘要 201 ...

  3. 【系统架构设计师】软考高级职称,一次通过,倾尽所有,看完这篇就够了,方法和技巧这里全都有。

    目录 背景 报考条件 通过率 考试时间要求 系统架构设计师考试内容 证书的价值 备考建议 报班&自学 分享下我的自学方法 必胜法宝 分享我考试的心态 [系统架构设计师]软考高级职称,一次通过, ...

  4. 计算机基础ip地址私有地址,关于ip地址的详解,看完这篇就够了

    原标题:关于ip地址的详解,看完这篇就够了 前天我们发布了什么是公网ip?什么是内网ip?为什么ip地址通常以192.168开头?,有朋友反映有没有更基础的,那我们就从ip地址开始说起. 一.特殊的I ...

  5. PHP电子合同对接流程,企业如何API对接云合同电子合同系统,看完这篇就够了

    自有系统要怎样对接电子签名系统? 电子合同管理在哪个平台操作? 合同签署怎么完成? 看完这篇就够了 多种方案,系统与平台无缝对接 不管是供应链.人力资源.互联网金融还是大型企业,大部分平台都有自己的业 ...

  6. Java 集合框架看这一篇就够了

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:都说了多少遍,不要再学 JSP 了!个人原创100W+访问量博客:点击前往,查看更多 话不多说,直接上图: Ja ...

  7. 黑客零基础入门教程,从入门到精通学习路线规划,看完这篇就够了。

    很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习,最终也只是会无疾而终!黑客是一个大的概念,里面包含了许多方向,不同的方向需要学习的内容也不一样. 想要成为黑客,却苦于没有方向,不知道从何学起 ...

  8. 不必东奔西走,Java 集合框架看这一篇就够了

    Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的:Collection 和 Map 顾名思义,容器就是用来存放数据的. 那么这两大接口的不同之处在于: Collecti ...

  9. web开发中的长度单位(px,em,ex,rem),如何运用,看完这篇就够了!

    原创 2017-03-08 web小二 web前端开发 作为一名前端开发人员,css中的长度单位,都是我们在工作中非常熟悉的名词,因为没有它们,我们就不能声明某个字符应该多大,或者某些图像周围应该留白 ...

最新文章

  1. wfs.js 多路视频 串屏 闪烁
  2. 创建linux目录,Linux目录的创建方法
  3. python创建txt文件
  4. python 可变 与 不可变类型
  5. argsort()返回数据从小到大的“索引值”
  6. 信安 | 网上吵个架都能被封号?是“黑科技”还是“黑产”?
  7. shell 判断字符串是否存在包含关系
  8. 动态规划——骨牌平铺问题
  9. 程序员如何看待实力与运气
  10. Go Anywhere Chair
  11. 全新的福昕JavaScript PDF阅读器
  12. python春节对客流量的影响_春节对经济的影响
  13. 有道智选-网易效果推广
  14. 如何处理u盘一插进电脑就自动打开里面的所有文件夹
  15. 中英文翻译功能 php,PHP微信开发之翻译功能
  16. Visial Studio中“变量已被优化掉 因而不可用”的解决方案
  17. SpringCloud系列【security oauth2】
  18. 数组排序(O(n的二次方))
  19. 计算机培训艺术字体,Word2019中使用艺术字,设置文字倒置
  20. 计算机发展变化初三英语作文,初三我的变化英语作文

热门文章

  1. 安卓文件浏览器ftp服务器地址,安卓文件浏览器ftp服务器
  2. Win10以管理员的身份登录到Windows,创建新的用户的方法,手把手超详细,亲测有效
  3. 毕业新生找工作面试有哪些需要注意?
  4. html如何设置div的边框颜色
  5. python实现excel函数_python操作excel
  6. 华为荣耀服务器浏览网页卡,华为荣耀6PLUS手机信号很好但是网速很慢的解决办法...
  7. 《极简主义》思维导图
  8. strcasecmp详解
  9. oracle 11g b表空间什么情况下自动增加,oracle 11g 查看表空间使用情况,表空间创建,表空间添加数据文件,修改数据文件自动增长,删除表空间...
  10. 软件测试工作流程总结