JAVA线程相关知识(1)
来源:互联网 发布:pdf转jpg for mac 编辑:程序博客网 时间:2024/06/05 12:05
JAVA线程相关知识(1)
鄙人首次写博客,主要是自娱自乐,如果有幸被大佬看到,多谢指出其中的错误。(还有希望看到这篇文章的大佬能留下个足迹,我只是想知道有没有人能看到,,,谢谢)
进入正题:
先说一下程序,进程,线程之间的区别还有联系
程序:程序是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。
说白点就是静态代码,是应用程序执行的蓝本。
进程:进程是指一种正在运行的程序,有自己的地址空间,系统会自动分配内存空间;
拥有自己的生命周期(5个状态,一会说)。
线程:线程是进程内部的一个执行单元,一个进程中可以有多个线程,如果有多个线程
的话就是多线程了;线程打个比喻来说:BOSS给你们个项目,分配了下,一个人
去做前端,一个人去做后台, 总项目就是进程,做前端和做后台分别为两个线程;
线程: 线程是进程的更小可执行单元,每条线程都拥有着自己的生命周期,同一个程序中的多个线程可以并发执行; 特点: 轻量级进程 独立调度的基本单位 共享进程资源 可并发执行 提到并发执行,还有一词是并行执行——— 并行执行:是指在同一**时间点**同时执行 并发执行:是指在同一**时间段**同时执行(java中的都是并发执行) 至于程序运行中看似是并行执行的,其实都是并发执行的看似同时运行的,其实不是,在同一个时间点上,只 能有一个程序在CPU上运行。 这个例子就能看出两个线程,只能有一个线程在运行
public class TortoiseThread extends Thread{ //乌龟线程 /* *线程体 */ @Override public void run() { //this.setName("乌龟线程"); while(true){ System.out.println("乌龟领先了-------------"+this.getName()); } }}
public class TestThread1 { public static void main(String[] args) { Thread.currentThread().setName("兔子线程"); //乌龟线程 TortoiseThread tt=new TortoiseThread(); //调用方法 //tt.run(); //启动乌龟线程 tt.setName("乌龟线程"); tt.start();//启动线程 //兔子线程 while(true){ System.out.println("------------兔子领先了------------"+Thread.currentThread().getName()); } }}
1.线程分为多线程还有单线程 如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为多线程; 多线程相比单线程并不能提高运行速率,毕竟只有一个CPU,只不过多线程执行的时候会使程序有更大的 可能占用CPU资源。 多线程的还有个优点在于取消了主循环/轮询机制。一个线程可以暂停而不影响程序的其他部分。 2.创建线程 线程创建分为常见的两类 1)继承Thread类 A.自定义一个类继承Thread类 B.重写run()方法 C.创建一个自定义类线程对象 D.启动线程 【start方法】 启动多个线程,执行结果不一定相同。 原因:线程具有随机性(多个线程互相抢占CUP,这一段时间可能是A线程执行,下一段时间就可能是B线程) 2)实现Runnable接口 A.定义一个类 实现Runnable接口 B.实现run()方法 C.创建自定义类的的对象A D.创建Thread对象并把对象A作为构造A传递 E.启动线程【start方法】 【区分run方法和start方法】 run方法是线程的一个启动,jvm(JAVA虚拟机)会自动运行,手动调用run方法相当调用普通方法 start方法是启动线程的方法,调用后,jvm会自动调用run方法(在java中手动跳进start方法就 能发现方法当中含有run方法) 3)对比两种方式 A.从继承方面 使用继承Thread方式,因为java是单继承 有局限性 因为java中类可以实现多个接口所以使用第二种方式比较好 B.资源共享 使用Runnable方式可以实现属性值共享 注意点:java是多线程的 一般来说有两个线程 main线程 gc(垃圾回收)线程 3.线程中的方法 1)线程的休眠方法 sleep Thread.sleep(毫秒数) 注意:sleep方法在哪个线程被调用了,哪个线程就休眠 2)线程中断 Interrupt方法 打断线程 A.作标记 B.stop(); C.使用线程对象.interrupt()打断线程 InterruptException发出异常 对于流的阻塞不能使用Interrupt 3)线程礼让 yield() 注意点:调用yield方法中断了一下,之后还会参与抢占CPU,所以可能出现一种情况,当此线程刚回到就 绪状态,下一个执行的线程还是它。 4)线程优先级 getPriority()//获得线程的优先级 setPriority()//自定义线程的优先级 注意点: 值得范围是1-10 默认 5(10为最高) 5)线程加入 join() 等待当前线程执行完毕 6)守护线程 设置守护线程标识符thread.setDaemon(true); 注意点:当线程A设置为守护线程,当其他线程执行完毕,线程A还未执行完毕,则线程A终止执行 7)其他方法 getName();//获得当前线程的名称,每个线程都有一个默认命名,命名方式就是传说中的阿拉伯递增式命名法 setName();//给当前线程一个自定义的名字 currentThread():返回当前线程 getState():获取线程状态 inAlive 判断线程状态 activeCount(); 4.线程的生命周期 1) 新建状态 指的是线程只是被new出来了,并没有被执行,此时也可以给线程一些操作,如setName(); (就是代码写好了,啥都没干呢) 2) 就绪状态 调用了start方法,程序已经运行但是这个线程并没有分配到CPU资源,在等待分配。这时候就是就绪状态。 3) 运行状态 运行状态就是程序调度一个处于就绪状态的进程,为其分配的CUP,此时真正运行了线程的run方法; ps. 可以用inAlive方法判断是否在运行状态,是的话就返回true; 4) 阻塞状态 线程在运行状态中被某些原因打断不能继续运行从而进入阻塞状态,进入阻塞状态后等待被唤醒,进入就绪 状态。 5) 死亡状态 线程进入死亡状态,无法再次唤醒。 进入死亡状态有两种情况:1.线程run方法执行完毕,自动进入死亡状态, 2.线程执行过程中被提前终止。
状态这地方写的比较少,有机会再补充。
阅读全文
1 0
- JAVA线程相关知识(1)
- Java线程相关知识
- java 线程相关知识
- Java线程相关知识
- Java(android)线程池相关知识
- Java线程相关知识总结
- java线程相关知识整理
- 线程 相关知识 (一)
- 线程 相关知识(二)
- 每日一得--java线程相关知识笔记
- JAVA相关知识1
- Java线程的相关方法串联线程知识
- 有关线程的相关知识(上)
- 有关线程的相关知识(下)
- 线程的相关知识
- 线程相关知识
- 线程的相关知识
- 线程相关知识
- hive读取与flume写入hdfs文件冲突
- 根据26个英文字母排序
- SpringMVC与Struts2区别与比较总结
- windows下启动redis
- 厉善信息科技告诉你如何看待外包公司
- JAVA线程相关知识(1)
- 【Wt, C++ Web Toolkit 】 Wt4.0.1 + VS2015 编译
- python库函数总结_tensorflow篇
- Pointers&Arrays
- oracle数据库中伪列rownum\rowid的使用
- Spring Security启用csrf防护后如何对请求添加tocken
- React学习笔记_总结
- QRadioButton样式
- 图像处理和图像识别中常用的329个OpenCV函数