jav学习日记:多线程(一)
1.程序 进程 和线程的概念与区别
程序是一段静态的代码
---如写的helloworld
进程是代码的一段执行过程,正在运行的程序,包括产生存在消亡的过程 即生命周期
---如运行的qq -
--程序是静态的,进程是动态的
---进程作为资源分配的单位,系统会为每个进程分配不同的内存区域,如方法区和堆
线程:进程可被进一步分解为线程,每个线程都有独立的运行栈和程序计数器,线程切换的开销小
---若同一个进程同一个时间并行多个线程,就是支持多线程的
--线程是独立的,每个线程都拥有独立的运行栈和程序计数器
---一个进程中得多个线程共享相同得内存空间---》从同一个堆中分配对象,可以访问相同的对象和变量,但多个线程同时操作也带来了安全隐患
2.单核cpu 只能执行一个线程,如收费站只有一个窗口,大家都只能去他那,是伪多线程多核cpu 能同时执行多个线程,比如收费站有好多窗口,是真多线程
---一个main函数有至少三个线程:主线程,垃圾回收线程,异常处理线程,异常处理出问题也会影响主线程
并行与并发
并行:多个cpu同时执行多个任务,比如不同的人做不同的事,
并发:一个cpu“同时”执行(不停歇换)多个任务,比如多个人做同一个事,秒杀
单核cpu只使用单个线程完成多个任务时间比同时用多个线程完成多个任务所用的时间短(多线程来回切换要花不少时间)
多线程的优点
1.提高应用程序响应:比如加载视频的时候看电子书,总不能视频加载完成才让电子书程序执行
2.提高计算机系统CPU的利用率:狠狠地压榨剩余价值捏,不让你闲着
3.改善程序结构:设计程序的时候就可以
何时需要多线程:同时执行多个任务,程序需要等待,需要后台运行的程序
- 多线程的创建的方式
- 一.利用继承
1:创建继承于Thread的子类
2.重写Thread的run()方法 将线程要执行的操作声明在run里
3.创建Thread类子类的对象
4.通过该对象调用Start()
publicclassTreadTEst {publicstaticvoidmain(String[] args) {//3.创建子类对象MyThreadmyThread=newMyThread();Threadthread=newThread();//4.调用start()方法 1.启动当前线程 2.调用当前线程的run方法
// myThread.start();Thread.currentThread().start();System.out.println("我是主线程");}}
};
classMyThreadextendsThread{//1.创建子类@Override//2.重写run方法publicvoidrun() {for (inti=0; i<100; i++) {if(i%2==0)System.out.println(Thread.currentThread().getName()+":i);}}
}
//问题1 不能直接通过run()启动线程,start 可以启动当前线程并且调用run(),可以和main后主线程形成多线程,run()则虽然正常运行但是不能形成多线程
//问题2 再启动一个线程,遍历100内的偶数,要想多个线程,需要创建多个对象
//仍然在main线程中执行
注意1.也可以使用匿名子类的方式 new Thread{重写run方法}.strat(),一步到位
2.想创建两个线程就用两个子类继承重写阿巴阿巴
二.利用Runnable接口的实现
实现Runnable 接口
1.传建一个实现了Runnable接口的类
2.实现类去实现Runnable中的抽象方法run()
3.创建Thread类的构造器中,创建Thread类的对象
4.将次对象作为参数传递到Thread类的构造器中,创建THread类的对线
5.通过Thread类的对象调用start()
package MULTI1;/** @Auther:sincer* @Date:2023/1/29*shuoming:创建多线程的方法二: 实现Runnable 接口1.传建一个实现了Runnable接口的类2.实现类去实现Runnable中的抽象方法run()3.创建Thread类的构造器中,创建Thread类的对象4.将次对象作为参数传递到Thread类的构造器中,创建THread类的对线5.通过Thread类的对象调用start()*///-------------------实现-------------------------
// 1.传建一个实现了Runnable接口的类
classMThreadimplementsRunnable{
// 2.实现类去实现Runnable中的抽象方法run()publicvoidrun(){System.out.println(Thread.currentThread().getName()+" 123");}}
publicclassThreadTest1 {publicstaticvoidmain(String[] args) {
//3.创建Thread类的构造器中,创建Thread类的对象MThreadmThread=newMThread();
//4.将次对象作为参数传递到Thread类的构造器中,创建Thread类的对象Threadt1=newThread(mThread);t1.setName("线程1");t1.start(); //再启动一个线程,无需再创建对象,只需将对象放在不同的构造器中Threadt2=newThread(mThread);t2.setName("线程2");t2.start();}}
结果
注意
1.只创建一个对象就可以实现多个接口
孰优孰劣?
1.
利用继承的方式,子类需要继承Thread类,java单继承就不能继承于其他类
利用实现接口的方式,因为继承的是接口,所以可以多 继承
2.
实现的方式更适合多个线程有共享数据的方式
两种创建多线程的方式有无联系?(灵魂画师版)
总之都是通过重写run()方法实现的,只不过一个是通过继承+重写,一个通过把实现过Runnable接口的对象传入Thread( Runnable Targaet )里来实现,利用多态
最后都通过.start 调用run()方法来操作
简洁版
Thread的方法
1.start():启动当前线程,调用当前线程的run()
2.run()通常要重写thread类中的此方法,将创建的线程要执行的操作声明在此方法中
3.currentTread():静态方法,返回执行当前代码的线程
4.getName()获取当前线程的名字
5.setname()给当前线程命名
-----可以通过Thread.currentTread.get/set name 来获取/命名当前线程
6.yied():释放当前cpu的执行权,cpu重新分配线程,可能还是当前线程,也有可能是其他线程
7.join()在线程a中调用线程b的join(),这时候线程a进入阻塞状态,知道线程b执行完毕才结束阻塞状态
8.stop()强制结束线程生命周期
9.sleep(time)让当前线程阻塞time的时间
10.isAlive()判断是否存活
*/
jav学习日记:多线程(一)相关推荐
- Java学习日记1——基础认知
Java学习日记1--基础认知 学习Java阶段,如果发现不正确的描述,还请指正! 首先附上Java相关下载链接和配置教程链接 Java相关软件工具下载地址:官方下载 Java环境配置(win10配置 ...
- 菜菜的Python学习日记 | 正则表达式你必须了解的知识点
系列索引:菜菜的Python学习日记 | Python从入门到入土详解 文章目录 常用规则 Python对正则表达式的支持 常用规则 符号 解释 示例 说明 . 匹配任意字符 b.t 可以匹配bat ...
- C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...
在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPo ...
- java的圆周率_java学习日记,圆周率的打印
前段时间看到听说学习java每天写技术贴会对自己提升很大,我现在学习java也就2个周,算不上技术贴,就写写学习日记吧. 昨天师傅给我出了一道题,说是试试用java打印圆周率. 刚开始我的思路是,如果 ...
- GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考
GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考 标签: cuda存储线程结构网格 2012-12-07 16:30 6298人阅读 评论(4)收藏 举 ...
- GPU(CUDA)学习日记(十三)------ CUDA内存简介
GPU(CUDA)学习日记(十三)------ CUDA内存简介 标签: cuda存储线程结构 2012-12-07 16:53 2902人阅读 评论(0)收藏 举报 分类: GPU(16) CUDA ...
- GPU(CUDA)学习日记(九)------ CUDA存储器模型
GPU(CUDA)学习日记(九)------ CUDA存储器模型 标签: cuda存储bindingcache编程api 2012-09-27 10:53 1677人阅读 评论(1) 收藏 举报 分类 ...
- 语言余一个负数_C语言学习日记(8)——整数溢出
小时候喜欢玩电子计算器,觉得很神奇,想要算什么数,立刻就能算出来.当时看着计算器的液晶屏幕就想,如果算一个很大的数,超过了屏幕上面数字的位数,会怎么样呢?试了以后结果是INF,那就是无穷大了.虽然当时 ...
- SpringMVC学习日记 1.Spring框架
SpringMVC学习日记 1.Spring框架 Spring简介 Spring框架是一个开源框架,由Rod Johnson组织和开发,生产目的在于简化企业级应用的开发. 主要特性 非侵入(no-in ...
最新文章
- 楷书书法规则_硬笔书法入门学习“三步法”,让练字不再难
- JavaScript的基本使用
- Leaflet中使用Leaflet.Path.Transform插件实现旋转图形
- React-引领未来的用户界面开发框架-读书笔记(七)
- 【递归与递推】青蛙过河
- oracle怎么变为整数,如何在Oracle 11g SQL中为char添加整数?(How to add integers to char in Oracle 11g SQL?)...
- linux c 静态连接,Linux cmake 静态链接boost
- 深入浅出设计模式(一)
- linux iozone测试工具,linux系列之常用工具:iozone测试磁盘性能
- 录视频时帧数越高越好么?
- ubuntu 网易云音乐安装
- Orientation模块管理设备的方向信息,包括alpha、beta、gamma三个方向信息,通过plus.orientation可获取设备方向管理对象
- windows cmd打开新窗口关闭窗口
- 五款免费同步备份软件介绍
- open judge 内排序:Freda的越野跑
- 从零开始的单片机学习(四)
- Microsoft Visio 2010 - 弧线
- Strerror函数和Perror函数的介绍及使用
- 一个人做游戏然后实现盈利的经验
- 计算机电池的性能参数,小技巧 笔记本电池健康报告建立与解读