java学习笔记(基础篇)—线程
2019-08-16 11:09:47来源:博客园 阅读 ()
java学习笔记(基础篇)—线程
一、线程与进程
线程是程序执行的最小单位,是动态的。
进程是系统进程资源分配和系统调度的最小单位,是动态的。
线程和进程的目的:多任务--->效率高
同时性
在同一个时间点只能执行一个进程或线程
在同一个时间段可以执行多个进程或线程
多进程的数据不共享,每个进程都有自己的独立内存空间。多线程数据的进程的数据是共享的,每一个线程又有自己独立堆栈区空间。线程与线程之间是独立的,相互之间不受影响。
一个程序可以启动多个进程
一个进程可以启动多个线程
线程必须通过进程启动,不能独立存在的。
.class运行在JVM上,.class就是一个一个的线程。JVM就是一个进程。
二:线程的三要素
CPU:
运行线程,所有线程共享CPU。只有线程抢占CPU成功才会执行。
代码:
线程运行过程中执行的代码块。线程启动之后会执行public void run()的方法。
数据:
? 1)局部变量是多线程不共享
? 2)extends Thread方式实现多线程,静态变量是共享,实例变量不共享
? 3)implements Runnable方式实现多线程,静态变量是共享的,实例变量也共享
三:使用线程
第一种方式:
class MyThread extends Thread{
public void run(){
}
}
建线程:Thread t1=new MyThread();
//不要t1.run()来企图启动线程,那是单纯的调用该方法,并没有启动一个线程
启动线程: t1.start();
第二种方式:
class MyThread implements Runnable{
public void run(){
}
}
创建线程:MyThread m=new MyThread();
Thread t1 = new Thread(m);
启动线程: t1.start();
Thread类中的方法:
getName(): 获取当前线程的名字
static sleep(long): 强制当前正在执行的线程休眠(暂停执行),只是让出CPU,但不会释放锁。
static currentThread(): 获取当前正在执行的线程。
Thread类中的方法:
getName():获取当前线程的名字
static sleep(long):强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。
static currentThread():获取当前正在执行的线程。
注意:
线程的运行时抢占式,所以线程的执行结果是不可预知的。
四:为什么要有两种方式
java单继承
class Test extends Student implements Runnable{
}
五:线程的状态
a)新建状态(new):线程对象已经创建,还没有在其上调用start()方法。
b)就绪状态(Runnable): 线程已经准备好了,等待CPU的调度,当线程有资格行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入就绪状态。在线程运行之后或者从阻塞、等待或睡眠状态回后,也返回到就绪状态。就绪状态维护了一个线程池。 所有的就绪状态的线程都会进入到线程池中。
c)运行状态(Running):线程调度程序从可运行池中选择一个线程作为 当前线程时线程所处的状态。这也是线程进入 运行状态的唯一一种方式。CPU正在执行的线程。
d)等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到就绪状态。
e)死亡状态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
六:中断线程:让线程正常结束,到死亡状态
1)使用标志变量中断线程。就好像开车一样。
2)使用stop()已经过时了,虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是不受提倡的。
Thread类中的方法:
join(): 等待线程的执行结束。在哪个线程中调用就谁等待。谁调用该方法就等待谁。
interrupt(): 中断阻塞中的线程。不能中断正在执行的线程。
isInterrupted(): 判断是否被中断
static interrupted(): 清空中断信息
七:线程的并发访问:多线程同时操作同一个对象。
synchronized(共享区){临界区}
共享区:多线程同时操作同一个对象
临界区:多线程对共享区进行操作的代码区
将所有影响的方法都定义成线程安全的方法就变成了线程安全的类。synchronized可以放在方法上,就是一个同步方法。
同步锁有很多种,这里只是简单的描述了一下synchronized关键字,关于具体的使用和细节,后续会专门推出一篇文章来讲。
欢迎访问我的腾讯云+社区:传送门
原文链接:https://www.cnblogs.com/chlinlearn/p/11246290.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash