Java基础-多线程
1.线程:程序中单独顺序的控制流。线程本身不能运行,只能用于程序中。
进程:执行中的程序,
word,编辑的同时,可以打印,拼写检查
2.进程与线程的区别:
1)进程是静态的概念,线程是动态的概念
2)多个进程的内部数据和状态是完全独立的;多线程是共享一块内存空间和一组系统资源,有可能相互影响
3)线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,
线程的切换比进程切换的负担要小
4)进程重量级的任务,需要分配给他们独立的地址空间,进程间通信是昂贵和受限的,进程间的转换也是需要花费的
线程是轻量的,共享相同的地址空间,并分享同一进程,通信便宜的,转换低成本的
3.多线程编程的目的:
最大限度的利用CPU资源
当某一线程的处理不需要占用cpu资源而只和IO等资源打交道时,让需要占用cpu资源的其他线程有机会获得cpu资源
*当程序运行时,就会自动的产生一个线程,main方法就运行在这个主线程内
*一个进程可以包含一个或多个线程
*一个程序实现多个代码同时交替运行就需要产生多个线程
*cpu随机的抽出时间,让我们的程序一会做这件事情,一会做另外一件事情
*java内置支持
*并发运行
*每个线程有独立的执行路径,多线程是多任务处理的一种特殊形式
*一个进程至少要包含一个线程
*对于单核cpu来说,某一时刻只能有一个线程在执行(微观串行),宏观来看,多个线程在同时执行(宏观并行)
*对于多核cpu来说,可以真正做到微观并行
4.多进程和多线程:
*多任务处理两种类型:
基于进程的,基于线程的
1)基于进程的多任务处理,程序是调度程序所分派的最小代码单位
2)基于线程的多任务处理,线程是最小的执行单位
意味着一个程序可以同时执行两个或多个任务的功能
word,编辑的同时,可以打印,拼写检查
5.如何实现:
5.1继承Thread类,重写run方法
将我们希望线程执行的代码放到run方法中,然后通过start方法启动线程
start方法首先为线程的执行准备系统资源,然后调用run方法
*如果直接调用run方法,将不是以单独线程的方式启动
*要想以多线程方式启动,必须调用start方法
*线程执行结束,不能restart
5.2实现Runnable接口,实现run方法
将我们希望线程执行的代码放到run方法中,
然后使用我们实现的类作为参数实例化一个Thread对象,通过这个Thread对象的start方法启动线程
*Thread类实现了Runnable接口
*当生成一个线程对象时,如果没有为其设定名字,那么线程名字将是如下形式:Thread-number
该number是自动增加的,并被所有的Thread对象所共享
5.3线程的启动start方法
两种方法都要调用线程的start方法为线程分配必须的资源
当一个类已经继承了其他的非线程类的时候,如果要想使其成为线程类,则必须实现Runnable接口
5.4线程的停止
线程的消亡不能通过stop方法,而是让run方法自然结束
推荐的方式:
6.线程的生命周期
创建、可运行、不可运行,消亡
6.1状态转换图
创建(new)、可运行(start)、运行、阻塞(sleep)、消亡
7.优先级
便于调度
1)线程创建时,子继承父的优先级
2)线程创建后,可通过调用setPriority()方法改变优先级
3)1-10的正整数
7.1线程调度策略
1)选择优先级最高的线程运行,发生以下情况,会终止线程的执行
*线程体调用了yield方法,让出对cpu的占用
*调用了sleep方法,使线程进入睡眠状态
*线程由于IO操作而受到阻塞
*另一个更高优先级的线程出现
*在支持时间片的系统中,线程的时间片用完
8.关于成员变量与局部变量
多个线程对同一个对象的成员变量进行操作时,他们对成员变量是彼此影响的
一个线程对局部变量的改变对另一个线程不具有影响
9.线程的同步
多个线程同时访问一个有限的资源
解决方法:为资源加锁
访问资源的第一个线程为其加上锁以后,其他线程便不能再使用那个资源,除非被解锁。
上锁是对对象上锁
9.1synchronized
修饰方法,修饰static方法,修饰代码块[synchronized(this)]
1)同步方法:synchronized修饰的方法
synchronized修饰的代码块
粗粒度
*java中的每个对象都有一个锁(或监视器),当访问某个对象的sychronized方法时,表示对该对象上锁
此时其他线程无法再访问该方法,直到执行完毕
*如果一个对象有多个synchronized方法,同一时刻某个线程已经进入到了某个synchronized方法,
那么在该方法没有执行完毕前,其他线程是无法访问该对象的任何synchronized方法的
*静态同步方法。如果某个synchronized方法是静态的,那么当线程访问该方法时,
它的锁并不是synchronized方法所在的对象,而是synchronized方法所在对象所对应的Class对象。
因此,当线程分别访问同一个类的两个对象的两个static,sychronized方法时,他们的执行顺序也是顺序的。
2)同步代码块
synchronized(obj),synchronized(this)
更细粒度
*当synchronized方法执行完或发生异常时,会自动释放锁
*被synchronized保护的数据应该是private的
*同步线程状态转换图
9.2线程间的相互作用
1)wait and notifiy,notifyAll
lock pool
wait pool
具有wait,notify的线程状态图
wait与notify方法都是定义在Object类中,而且是final的,因此会被所有Java类所继承,并且无法重写
这两个方法要求在调用时线程应该已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或块当中。
当线程调用了wait方法时,会释放掉对象的锁
当另外的线程调用了notify,notifyAll方法时,会唤醒处于wait状态状态的线程
生产者,消费者
哲学家就餐问题
死锁
*wait必须在synchronized代码块中调用,调用wait方法后会释放锁
另外线程调用notify或notifyAll方法会唤醒wait的线程,等到再次获得锁的时候恢复运行
*使用while进行条件 和 使用if进行条件判断比较
2)sleep也是会导致线程暂停的方法
定义在Thread类中
*sleep方法会导致线程睡眠指定的毫秒数
线程在睡眠的过程中是不会释放掉对象的锁的
*调用wait方法后,如果不调用nofity,notifyAll,将永远不会被唤醒
sleep在睡眠指定时间后,会自动醒来
以上两点是sleep和wait的区别
10.线程组
所有线程都隶属于一个线程组。可以是一个默认的线程组,也可以是一个创建线程时明确指定的组。
*在创建之初,线程被限制在一个组里,而且不可能改变到一个不同的组
*若创建多个线程而不指定一个组,他们会与创建它的线程属于同一个组
相关推荐
2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 枚举类 2020-4-10 java 注解(Annotation) 2020-4-11 Java 集合 2020-4-15 java 泛型 2020-4-18 java IO流 2020-...
同时,学习Java的并发编程,包括线程、同步机制(synchronized关键字和Lock接口)以及并发集合(如ConcurrentHashMap),能帮助你编写出多线程环境下的高效程序。 最后,Java的异常处理、垃圾回收机制以及内存管理...
Java的设计目标包括了简单性、安全可靠性、面向对象、分布式计算、平台无关性、多线程和动态性。这些特性使得Java在电子商务、金融、证券等多个行业中广泛应用,例如通过J2SE(Java2 Standard Edition)、J2EE(Java...
本笔记将深入探讨Java的基础知识和核心概念。 1. **Java基础** - **语法**:Java语法与C++类似,但更加简洁。例如,Java使用垃圾回收机制自动管理内存,避免了C++中的内存泄漏问题。 - **类与对象**:Java是面向...
6. **支持多线程**:Java内置了对多线程的支持,可以轻松地编写并发执行的程序。 #### 四、Java与编译型语言 Java虽然通常被视为解释型语言,但实际上它结合了编译和解释两种方式。Java源代码先被编译成字节码,...
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
Java提供了多种类来支持这些操作,如`Date`, `Calendar`, `SimpleDateFormat`等。在上述笔记中,提到了几个关键点: 1. **计算时间差**:通过`System.currentTimeMillis()`方法可以获取当前系统时间的毫秒值,两次...
这些"JAVA笔记-针对于刚开始学习JAVA的有实质性帮助"包含了作者在实际开发中的经验总结,旨在为初学者提供有价值的指导。以下是对Java基础知识的详细阐述: 1. **Java简介**:Java是由Sun Microsystems(现为Oracle...
Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,可以使用 ...
Java的特点包括简单性、面向对象、健壮性、安全性、高性能、可移植性、多线程和动态性。学习Java SE基础,你需要掌握基本语法、数据类型、控制结构、类和对象等概念。 "Java中public class与class的区别"是一个关键...
Vector与ArrayList类似,也是基于数组实现,但它线程安全,但在多线程环境下,Vector的性能通常低于非同步的ArrayList。Stack是一个后进先出(LIFO)的数据结构,它继承自Vector,常用于实现函数调用的堆栈、表达式...
7. **多线程**:Java内置了对多线程的支持,通过Thread类或实现Runnable接口可以创建并运行多个线程,实现并发执行。 8. **接口与内部类**:接口定义了一组方法签名,提供了一种实现多继承的方式。内部类(包括成员...
Java线程的知识点总结。doc
本笔记是北京邮电大学的一份 Java 笔记,涵盖了 Java 语言的基础知识、语法、面向对象编程、异常处理、多线程编程、IO 操作、网络编程、数据库编程等方面的内容。 Java 语言基础 Java 语言是由 Sun Microsystems ...
本笔记旨在帮助初学者从零基础逐步提升至J2SE(Java Standard Edition)和J2EE(Java Enterprise Edition)的高手水平。J2SE是Java的核心部分,提供了用于桌面应用程序和服务器端开发的基础框架;而J2EE则是Java在...
首先,Java笔记主要涉及Java语言的基础语法、面向对象编程概念、异常处理、集合框架、多线程、IO流、网络编程等内容。Java的基础是理解其核心特性,如类、接口、继承、封装、多态等面向对象概念。异常处理确保程序在...
Java内置了对多线程的支持,可以创建和管理多个并发执行的任务,提高程序效率。 9. **泛型** 泛型引入了类型参数的概念,增强了代码的类型安全性,避免了类型转换的麻烦。 10. **反射** 反射机制允许程序在运行...
1. 数据封装与访问控制:确保内部私有数据不被轻易访问,并且控制可以访问的数据粒度是多线程编程中的关键。例如,Map的状态包括它的数组、size、length和Entry对象内部数据,这些都需要合理设计来保证线程安全。 2...