`

Java笔记-Java基础(多线程)

    博客分类:
  • java
 
阅读更多

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.线程组

所有线程都隶属于一个线程组。可以是一个默认的线程组,也可以是一个创建线程时明确指定的组。

 

*在创建之初,线程被限制在一个组里,而且不可能改变到一个不同的组

*若创建多个线程而不指定一个组,他们会与创建它的线程属于同一个组

 

 

 

 

 

 

  • 大小: 476.6 KB
  • 大小: 298.2 KB
  • 大小: 296.7 KB
  • 大小: 323.3 KB
分享到:
评论

相关推荐

    java笔记.zip

    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笔记-从浅入深的入门学习

    同时,学习Java的并发编程,包括线程、同步机制(synchronized关键字和Lock接口)以及并发集合(如ConcurrentHashMap),能帮助你编写出多线程环境下的高效程序。 最后,Java的异常处理、垃圾回收机制以及内存管理...

    Java笔记-基础部分

    Java的设计目标包括了简单性、安全可靠性、面向对象、分布式计算、平台无关性、多线程和动态性。这些特性使得Java在电子商务、金融、证券等多个行业中广泛应用,例如通过J2SE(Java2 Standard Edition)、J2EE(Java...

    java笔记--

    本笔记将深入探讨Java的基础知识和核心概念。 1. **Java基础** - **语法**:Java语法与C++类似,但更加简洁。例如,Java使用垃圾回收机制自动管理内存,避免了C++中的内存泄漏问题。 - **类与对象**:Java是面向...

    Java笔记---李兴华

    6. **支持多线程**:Java内置了对多线程的支持,可以轻松地编写并发执行的程序。 #### 四、Java与编译型语言 Java虽然通常被视为解释型语言,但实际上它结合了编译和解释两种方式。Java源代码先被编译成字节码,...

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

    java笔记-非基础

    Java提供了多种类来支持这些操作,如`Date`, `Calendar`, `SimpleDateFormat`等。在上述笔记中,提到了几个关键点: 1. **计算时间差**:通过`System.currentTimeMillis()`方法可以获取当前系统时间的毫秒值,两次...

    JAVA笔记-针对于刚开始学习JAVA的有实质性帮助

    这些"JAVA笔记-针对于刚开始学习JAVA的有实质性帮助"包含了作者在实际开发中的经验总结,旨在为初学者提供有价值的指导。以下是对Java基础知识的详细阐述: 1. **Java简介**:Java是由Sun Microsystems(现为Oracle...

    Java多线程笔记

    Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,可以使用 ...

    javase基础自学笔记-java开端-概述

    Java的特点包括简单性、面向对象、健壮性、安全性、高性能、可移植性、多线程和动态性。学习Java SE基础,你需要掌握基本语法、数据类型、控制结构、类和对象等概念。 "Java中public class与class的区别"是一个关键...

    ---Java笔记---

    Vector与ArrayList类似,也是基于数组实现,但它线程安全,但在多线程环境下,Vector的性能通常低于非同步的ArrayList。Stack是一个后进先出(LIFO)的数据结构,它继承自Vector,常用于实现函数调用的堆栈、表达式...

    Java基础尚硅谷宋红康学习笔记

    7. **多线程**:Java内置了对多线程的支持,通过Thread类或实现Runnable接口可以创建并运行多个线程,实现并发执行。 8. **接口与内部类**:接口定义了一组方法签名,提供了一种实现多继承的方式。内部类(包括成员...

    java多线程笔记

    Java线程的知识点总结。doc

    java-完美笔记-北京邮电大学.pdf

    本笔记是北京邮电大学的一份 Java 笔记,涵盖了 Java 语言的基础知识、语法、面向对象编程、异常处理、多线程编程、IO 操作、网络编程、数据库编程等方面的内容。 Java 语言基础 Java 语言是由 Sun Microsystems ...

    java笔记--从菜鸟到j2se j2ee高手之路

    本笔记旨在帮助初学者从零基础逐步提升至J2SE(Java Standard Edition)和J2EE(Java Enterprise Edition)的高手水平。J2SE是Java的核心部分,提供了用于桌面应用程序和服务器端开发的基础框架;而J2EE则是Java在...

    java笔记 Java-Web笔记 J2EE三大框架笔记

    首先,Java笔记主要涉及Java语言的基础语法、面向对象编程概念、异常处理、集合框架、多线程、IO流、网络编程等内容。Java的基础是理解其核心特性,如类、接口、继承、封装、多态等面向对象概念。异常处理确保程序在...

    java学习笔记-----给java初学者

    Java内置了对多线程的支持,可以创建和管理多个并发执行的任务,提高程序效率。 9. **泛型** 泛型引入了类型参数的概念,增强了代码的类型安全性,避免了类型转换的麻烦。 10. **反射** 反射机制允许程序在运行...

    读书笔记-Java并发编程实战-基础篇

    1. 数据封装与访问控制:确保内部私有数据不被轻易访问,并且控制可以访问的数据粒度是多线程编程中的关键。例如,Map的状态包括它的数组、size、length和Entry对象内部数据,这些都需要合理设计来保证线程安全。 2...

Global site tag (gtag.js) - Google Analytics