javaSE(24)(多线程、网络编程、反射)

来源:互联网 发布:微信发淘宝优惠券链接 编辑:程序博客网 时间:2024/06/06 07:09

1.进程:进程是操作系统动态执行和资源分配的一个基本单元,就是程序执行的过程,在这个过程中会占用内存空间和CPU资源。在操作系统中,程序的体现就是进程。一个程序至少有一个进程,一个复杂的应用程序可能启动并使用多个进程,例如谷歌Chrome浏览器、腾讯的QQ等采用的就是多进程架构设计。进程间相互独立,不能互相访问或共享资源。
2.线程:线程是比进程更小的能独立运行的基本单位,它是进程的一部分,一个进程可以拥有多个线程,但至少要有一个线程,即主执行线程(java的main方法),我们之前写的都是单线程程序,线程不能够单独执行,它必须运行在处于活动状态的进程中,它可与同属一个进程的其他线程共享进程所拥有的全部资源。
3.多线程编程:在一个程序中能让两个for循环同时执行吗?一个进程中的多个线程可以并发(同时)执行,因此用多线程编程即可解决这个问题。在一些执行时间长、需要等待的任务上(文件读写和网络传输等),多线程就比较有用了,多是为了共享内存、充分利用CPU,是为了同时完成多项任务,是为了提高资源(内存和CPU)使用率从而提高程序的执行效率。
4.CUP与多线程:一个人能同时干多件事情吗?(边看片儿边写字)那计算机是怎么实现的呢?真正的“同时”几乎是不存在的,CPU在以极快的速度随机轮流执行程序,专业说法是程序在快速轮流抢占CPU资源。速度太快,人感觉不到。一个(程序)进程中如果只有一条生产线,这个程序称为单线程,一个(程序)进程中如果有多条生产线,这个程序称为多线程,多个线程同时执行时,CPU会随机性的、极快的、轮流的、执行每个线程,C++这种语言传统上一直是性能之王。但是,C++对多线程技术的支持非常有限。标准C++甚至没有提到线程这个概念。要想使用C++开发多线程程序是非常困难的。java从一开始就在语言层面上支持多线程。使用Java编写多线程的程序是非常简单的。因此,基本上所有的Java程序,包括J2ME、J2SE、J2EE程序都支持多线程技术。在传统单核、单进程CPU上,Java多线程程序在性能上无法与C++单进程程序相比。但是,随着多核、超线程CPU时代的到来,将成就Java性能之王的地位!java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 。守护线程的作用是为其他线程的运行提供服务,比如说GC线程。
5.在java中实现线程有两种方式:方式一. 继承Thread类,方式二. 实现Runnable接口
6.方式一和方式二:

7.多线程执行流程:每个Java程序都有一个默认的主线程。Java程序总是从主类的main方法开始执行。当JVM加载代码,发现main方法后就启动一个线程,这个线程就称作”主线程”,该线程负责执行main方法。在main方法中再创建的线程就是其他线程。如果main方法中没有创建其他线程,那么当main方法执行完时JVM就会结束Java应用程序。但如果main方法中创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CPU资源,即使main方法结束(主线程结束)JVM也不会结束,要一直等到该程序所有线程全部结束才结束Java程序,注意CUP的随机性,主线程不一定先执行,主的意思是必须有的意思。
8.两种实现方法的比较:1.由于java只支持电议继承,所以方式一的弊端显而易见,2.方式二更容易实现资源(类中的属性)的共享,让多个线程共性一个资源。实际开发的时候建议使用二。
9.解决线程安全的问题:出现线程安全的原因是:多个线程之间共享的数据不同步。判断是否存在安全隐患:1,代码总存在共享数据。2.多个线程可能同时操作共享数据。
10.解决办法:java中提供了一个同步机制(锁),也就是让操作共享数据的代码在某一时间段内只被一个线程执行(锁住),在执行过程中,其他线程不可以参与进来,这样共享数据就能同步了,简单来说就是给代码加把锁。
11.java同步机制的实现方式:1.同步代码块,2.同步方法(函数)。
12.同步代码块和同步方法如下:

13.同步的优劣:同步的好处:同步的出现解决了多线程的安全问题,弊端:当线程相当多的时候,以为每个线程都回去判断同步上的锁,这是很消耗资源的,无形中会降低程序的运行效率。
14.同步静态方法:静态方法(函数)也可以同步,用法和普通方法一样,只是需要注意,静态方法的锁肯定不是this。静态方法随着类的加载而加载,这时可能还没有该类的对象,但是一个类先加载进内存会先将这个类的字节码文件封装成对象,该对象的表示方式:类名.calss.这时静态方法的锁。
15.同步方法(函数)和同步代码块的区别:1.同步代码块使用的锁可以是任意对象,2.同步方法(函数)使用的锁是固定对象this。
16.使用同步的前提:代码中存在共享数据,多个线程可能同时操作共享数据。
17.实现同步的方式:同步代码块,同步方法。
18.注意细节:必须使用同一把锁,只把必须的代码锁起来。


19.虽然同步机制解决了线程安全问题,但也带来一一些弊端:1.效率会降低,每次都需要判断锁2.可能引发死锁,出现的概率非常小。但危害大。
线程之间彼此占用对方所需的资源,就是死锁,
20.解决死锁问题:可以使用任何对象的锁,所以Object类提供了释放锁的方法。
21.wait()和sleep()都可以让当前线程等待,区别:1,sleep()释放执行权(等待),不释放锁,因为肯定能醒。2.释放执行权(等待),释放锁。
22. Object类提供了notify()方法用来唤醒某个被wait()的锁,也就是唤醒线程
23.细节:wait()和notify()方法都是操作锁的,而锁存在于同步中,也就是说这两个方法必须出现在同步中(同步代码块或同步方法)。
24.线程间的通讯:生产者消费者。
25.线程之间是相互独立的,他们之间怎么相互通讯(打招呼),让他们认识一个共同的中间人,这个中间人还能管住他们(wait和notify)。
26.同步所并不只能用于线程安全问题,也可以结合wait和notify方法解决死锁和线程通讯问题。
27.单例设计模式:单例就是只有一个实例,该模式的作用是保证程序中,某个类的对象只有一个,比如将来的数据库连接类,怎么实现:构造方法私有化不让new,提供一个共有静态方法返回一个实例。懒汉式线程安全问题,开发的时候建议使用恶汉式。
28.适配器设计模式:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器设计模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法(空),而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。


29.网络编程:在使用Java开发C/S结构的网络应用程序时,处于客户端和服务器端的两个程序通过一个双向的通讯连接实现数据的交换,这个双向连接的一端称为一个Socket。也就是说,Socket通常用来实现客户端和服务器端的连接。Socket是Java网络编程的核心,无论是服务器端还是客户端,无论是发送数据还是接收数据都需要使用Socket,基于TCP协议的两端的Socket通过IO传输数据,基于UDP协议的两端的Socket通过数据报传输数据,java针对TCP和UDP提供了不同的几种Socket供开发人员使用。
30.TCP场合:打电话(可靠连接),发文件(数据大),服务器——客户端模式。
31.UDP场合:发短信(非可靠连接),聊天(数据小),端对端模式。
32.反射:给你一个字符串式的类名,你能创建出对象吗?现在有一个对象,你能输出这个对象的构造方法名、属性名这些信息吗?
33. java反射可以不通过new来创建对象并调用对象的方法,它提供了一种灵活、动态的机制。java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取对象信息以及动态调用对象方法的功能称为java语言的反射机制。说白了,就是从内存中的字节码文件中获取相关信息。具体见博客代码。

0 0