线程:被称为轻量进程,是程序执行流的最小单元。线程是进程中的一个实 体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源。
.png)
2.锁: Lock API:
lock():获取锁,如果锁被暂用则一直等待
unlock():释放锁
tryLock(): 注意返回类型是boolean,如果获取锁的时候锁被占用就返回false,否则返回true
tryLock(long time, TimeUnit unit):比起tryLock()就是给了一个时间期限,保证等待参数时间
lockInterruptibly():用该锁的获得方式,如果线程在获取锁的阶段进入了等待,那么可以中断此线程,先去做别的
3:Lock和synchronized有以下几点不同:
Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。 Lock可以提高多个线程进行读操作的效率
4:线程操作:
notify:唤醒线程池中某一个等待线程。
notifyAll:唤醒的是线程池中的所有线程。
wait: 将线程处于冻结状态,释放了执行权和资格。
sleep:将当前线程进入阻塞状态
5:wait和sleep区别(从执行权和锁来分析):
wait不一定指定时间。
sleep:必须指定时间,时间到自动从冻结状态转成运行状态
wait:线程会释放执行权,而且线程会释放锁。
Sleep:线程会释放执行权,但不是不释放锁。
6:方法:java.lang.Thread
Thread(String name):初始化线程的名字
getName():返回线程的名字
setName():设置线程对象名
interrupt():中断线程。
setPriority(int newPriority):更改线程的优先级。(虽设置了优先级,但是具体的实现取决于操作系统的实现,最大优先级10,最小1,默认是5 )
getPriority():返回线程的优先级,默认优先级是5。
toString():返回该线程的字符串表示形式,包括线程名称,优先级和线程组。
Thread.yield():暂停当前正在执行的线程对象,并执行其他线程。 setDaemon(true):将该线程标记为守护线程或用户线程。
join:临时加入一个线程的时候可以使用join方法。
current Thread():返回CPU正在执行的线程的对象
7.线程状态:
创建
可运行
运行
阻塞
死亡
8.创建线程:
1.继承Thread,复写run方法,把要执行的任务放在run方法中,调用start方法启动线程
2.使用Runnable接口.
该类中的代码就是对线程要执行的任务的定义.
1:定义了实现Runnable接口
2:重写Runnable接口中的run方法,就是将线程运行的代码放入在run方法中
3:通过Thread类建立线程对象
4:将Runnable接口的子类对象作为实际参数,传递给Thread类构造方法
5:调用Thread类的start方法开启线程,并调用Runable接口子类run方法
|
package cn.itcast.gz.runnable;
public class Demo1 {
public static void main(String[] args) {
MyRun my = new MyRun();
Thread t1 = new Thread(my);
t1.start();
for (int i = 0; i < 200; i++) {
System.out.println("main:" + i);
}
}
}
class MyRun implements Runnable {
public void run() {
for (int i = 0; i < 200; i++) {
System.err.println("MyRun:" + i);
}
}
}
|
反射
1.反射:动态加载一个指定的类,并获取该类中的所有的内容。
反射就是把java类中的各种成分映射成一个个的Java对象
获取对象的属性、方法
反射的好处:大大的增强了程序的扩展性。
2.Java反射示例:
Method [] methods = MyObject.class.getMethods();
for(方法方法:方法){
System.out.println(“method =”+ method.getName());
}
3.步骤:
1、获得Class对象(获取到指定的名称的字节码文件对象)
调用某个对象的getClass()方法 Person p=new Person();
Class clazz=p.getClass();
调用类的class属性来获取该类对应的Class对象
Class clazz=Person.class;
使用Class类中的forName()静态方法; (最安全/性能最好) Class clazz=Class.forName("类的全路径");
2、实例化对象,获得类的属性、方法或构造函数。
//获取Person类的所有方法信息
Method[] method=clazz.getDeclaredMethods();
//获取Person类的所有成员属性信息
Field[] field=clazz.getDeclaredFields();
//获取类的所有构造方法信息
Constructor[] constructor=clazz.getDeclaredConstructors();
3、两种创建对象的方法。
①newInstance()创建类的实例
Person p=(Person) clazz.newInstance(); //创建对象 p.setName("张三"); //设置属性
②先使用Class对象获取Constructor对象,
再调用newInstance()创建类的实例
//获取构造方法
Constructor c = clazz.getDeclaredConstructor(String.class,String.class,int.class); //创建对象并设置属性
Person p1=(Person) c.newInstance("李四","男",20);
4: 1.我们在对类进行检查之前,需要获取类对象。获得Class对象:
①编译时知道类名称:
类myObjectClass = MyObject.class;
②编译时不知道名称,在运行时将类名作为字符串
Class class = Class.forName(className);
2.类对象 class myObjectClass = MyObject.class;//得到Java类对象
3.类名称 String className = aClass.getName();//获取类名
4.类修饰符 int modifiers = aClass.getModifiers();//获取类修饰符 5.包信息 package = aClass.getPackage();//获取有关包的信息:
6.超类Class superclass = aClass.getSuperclass();//获取超类
7. 构造函数 Constructor [] constructors = aClass.getConstructors();//访问构造函数
8.接口列表 Class [] interfaces = aClass.getInterfaces();
//获取接口列表
9.方法 Method [] method = aClass.getMethods();//访问方法
10.变量 Field [] method = aClass.getFields();//访问变量
11.注解 Annotation [] annotations = aClass.getAnnotations();
//访问注解
5:java反射--属性
1.Field [] fields = aClass.getFields();//获得类中所有public的方法 2.Field field = aClass.getField(“someField”);
//根据变量名得到public变量
Field getDeclaredField(String name)
//根据方法名获得public和非public变量
Field[] getDeclaredFields()
//获得类中所有的public和非public方法
3.String fieldName = field.getName();//获取变量名称
4.Object fieldType = field.getType();//获取变量类型
5.获取和设置变量值
Object value = field.get(objectInstance);
field.set(objetInstance,value);
6.
.png)

- 多线程(五) java的线程锁
在多线程中,每个线程的执行顺序,是无法预测不可控制的,那么在对数据进行读写的时候便存在由于读写顺序多乱而造成数据混乱错误的可能性.那么如何控制,每个线程对于数据的读写顺序呢?这里就涉及到线程锁. 什么 ...
- java线程池与五种常用线程池策略使用与解析
背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQu ...
- 菜鸟学Java(十五)——Java反射机制(二)
上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
- “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java反射理解(五)-- 方法反射的基本操作
Java反射理解(五)-- 方法反射的基本操作 方法的反射 1. 如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法 2. 方法反射的操作 method.invoke(对象,参数列表) ...
- java线程池和五种常用线程池的策略使用与解析
java线程池和五种常用线程池策略使用与解析 一.线程池 关于为什么要使用线程池久不赘述了,首先看一下java中作为线程池Executor底层实现类的ThredPoolExecutor的构造函数 pu ...
- JAVA(五)反射机制/Annotation
成鹏致远 | lcw.cnblog.com |2014-02-04 反射机制 1.认识Class类 在正常情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在 java中也允许通过一个对象来找 ...
- JAVA基础部分复习(五、JAVA反射)
关于反射: 1.需要了解jvm类的加载机制(java高级部分会详细介绍) 2.反射的API其实只要多看看API和源码,很容易就懂了. 下面是代码,简单讲解反射的使用: import java.lang ...
随机推荐
- day 20 - 1 序列化模块,模块的导入
序列化模块 首先我们来看一个序列:'sdfs45sfsgerg4454287789sfsf&*0' 序列 —— 就是字符串序列化 —— 从数据类型 --> 字符串的过程反序列化 —— 从 ...
- 使用Github时遇到问题的解决方法
记录了一些我在使用Github时遇到问题的解决方法 git中报unable to auto-detect email address 错误的解决办法 问题描述: 执行 git commit -m &q ...
- Python注释、变量、常量
变量:就是将一些运算的中间结果暂存到内存中,以便后续代码调用 1.必须由数字.字母,下划线任意组合,且不能数字开头 2.不能是Python中的关键字,['and', 'as', 'assert'等] ...
- C# IIS站点管理--Microsoft.Web.Administration.dll
Microsoft中提供了管理IIS7及以上版本一个非常强大的API - Microsoft.Web.Administration.dll,利用该API可以让我们很方便的以编程的方式管理和设定IIS的 ...
- spring+myBatis 配置多数据源,切换数据源
注:本文来源于 tianzhiwuqis <spring+myBatis 配置多数据源,切换数据源> 一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样 ...
- Springboot 打jar包分离lib,配置文件正确方式
文章来源:https://my.oschina.net/xiaozhutefannao/blog/1932764 POM.xml <?xml version="1.0" en ...
- Python学习(四十三)—— Djago-admin管理工具
一.admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTAL ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- Git帮助之初始化项目设置向导
初始化项目设置向导 Git设置: git config --global user.name "Your Name Here" # 设置Git提交时的默认用户名,推荐使用本站用户名 ...
- 构建npm包出现"找不到node_modules"的问题
目录结构 解决方案 先在微信开发者工具->详细->使用npm 1.cd到\WeChatProject\miniprogram文件夹 2.npm init 3.npm install 4.n ...