多线程学习笔记
来源:互联网 发布:codeforces 知乎 编辑:程序博客网 时间:2024/06/10 01:12
多线程的创建有两种方式:继承Thread类和实现Runnable接口
程序~~~ 为完成特定任务、用某种语言编写的一组指令的集合,指静态的代码、静态对象
进程~~~程序的一次执行过程、或是正在运行的一个程序,是一个动态的,自身有产生、存在和消亡的过程
,基本就是指运行中的程序,
必须运行中的QQ,播放器等等,程序是静态的,进程是动态的
QQ不运行就是个程序,运行就有了进程
线程~~~一个进程可以被细分为多个线程,可以理解为进程是一条大河,不同功能的不同线程构成了
进程,就可以多个功能 了,这是多线程,线程就是一条小河
360,有一个进程,但是可以同时杀毒,清理,杀毒和清理就是线程,可以同时运行就是多线程
若一个程序同一时间执行多个线程,就是支持多线程
操作系统支持多进程,QQ或者360是多线程的
~~~每个java程序都有一个隐含的主线程:main方法
~~需要多线程的情况:
①、程序需要同时执行两个或多个任务
②、程序需要实现一些需要等待的任务时,比如用户输入,文件读写操作。网络操作。搜索等。
都有一个过程,用户输入需要打字,这个过程中就是需要等待的任务
③:需要一些后台运行的程序时
~~~判断程序是单线程和多线程:
看处理流程,单一的处理方式就是单线程,多种分支或同时运行的就是多线程
~~代码more里的①Test
~~~java的jvm允许程序运行多个线程,它通过java.lang.Thread类实现
~~~Thread类的特性
①每个线程都是通过某个特定Thread对象的run()方法来完成操作的,所以经常把run()方法的主体称为线程体
②通过该Thread对象的start()方法来调用这个线程
~代码more里的②Test 一个线程只能start一次
~
~~~如果通过继承Thread的方式实现多线程,一定要重写run()方法
实现的方式完成多线程
继承runable接口
~~~多线程优点
提高效率
提高CPU利用率
将长又复杂的进程分为多个线程,独立运行,利于理解和 修改
~~~java中的线程分为两类,一是守护线程 二是用户线程
唯一区别是判断JVM何时离开
守护线程是用来服务用户线程的,通过在start()方法前调用thread.setDaemon(true)可以 把一个用户线程变成一个守护线程 java垃圾回收就是一个典型的守护线程 如果jvm中都是守护线程(也就是没有用户线程了),那么当前JVM将会退出
线程的生命周期:JDK中用Thread.state枚举表示了线程的几种状态
新建:Tread对象或其子类的对象被声明并创建时
就绪:新建的线程被start后
运行:run后
阻塞临时终止自己的施行
死亡:线程完成全部工作或者提前强制性中止
run方法里的异常只能通过try…catch抛出,因为run的父类方法没有throw方式
运行个sleep()可以放大错误
thread.currentThread()获取这个线程,然后调用方法只对这个线程操作
线程的安全问题:(会不会出现错误)
1、原因:由于一个线程在操作共享数据的过程中。未执行完
的情况下,另外的线程参与进来。导致共享数据
存在了安全问题
2、解决:必须让一个线程操作共享数据完毕以后其他线程才有机会参与
共享数据的操作
3、java实现线程安全:线程同步机制
解决方式分为2种:1.同步代码块 2.同步方法 还有3.锁的方式
一:同步代码块:截图,把操作包起来就行了,只能包操作共享数据的方法,不能多也不能少。然后传入个对象
需要被同步的代码块:操作共享数据的代码
共享数据就是多个线程共同操作的同一个数据(变量)
同步监视器(对象)-全程变量才行:由任何一个类的对象充当,那个进程获取此监视器,谁就执行大括号里被同步的代码,俗称:锁
同步原理:截图
要求:所有的线程公用一个锁(同步监视器)
注意:在继承Thread实现的方式中,慎用this做同步监视器
二:同步方法(继承Thread的方式要考虑this指的对象是不是唯一的):将操作共享数据的方法生命为synchronized,即此方法为同步方法,能够保证当其中一个线程执行此方法时,其他线程在外等待直至此线程执行完 同步方法的锁:当前对象(隐形的),就是this,默认当前对象 接口的方式可以考虑锁必须是唯一的:static object obj = new object (用在thread中)
Ps:静态方法里不能有this 某个类的.class是指的是这个类本身
对于线程安全的理解:比如说有个if判断是不是空,一个进程进来了,判断是空,还没等返回呢另一个进程又进来了,造成了线程的安全问题,理想的是一个线程进来判断完后返回好了,都执行完了另一个线程再进来,才可以线程同步的一个弊端:同一个时间只能有一个线程访问共享数据,效率变低了 wait()--线程暂停--释放锁sleep()--不会释放锁只要操作共享数据到时候才会有线程安全问题
图文:
代码部分
- Java多线程学习笔记
- 多线程学习笔记
- 多线程学习笔记(一)
- 多线程学习笔记(二)
- 多线程学习笔记(一)
- 多线程学习笔记 一
- 多线程学习笔记 二
- 多线程学习笔记 三
- 多线程学习笔记 四
- 多线程学习笔记
- 多线程学习笔记
- 多线程的学习笔记
- 多线程学习笔记
- 多线程学习笔记
- 多线程学习笔记
- C#多线程学习笔记
- 多线程学习笔记:lock
- 多线程学习笔记
- 初学TCP/IP
- Spring学习笔记(七) --- 运行时值注入
- 17.10.12日报
- 关于快递费
- 多尺度Harris角点函数opencv代码解析
- 多线程学习笔记
- 第一篇博客: Hello world!
- springmvc中的DispatcherServlet视图记录
- 实验二 单链表实现
- 爬格子呀5-6
- 响应头编码及其含义
- Windows Server 2003 部署tomcat项目的注意事项
- 用jar命令将Web应用打包成war文件
- 如何把网页保存为PDF