多线程学习笔记

来源:互联网 发布: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()--不会释放锁只要操作共享数据到时候才会有线程安全问题

图文:















代码部分





原创粉丝点击