Java高级教程02
1.Java线程
1.1. 多线程和多进程
- 多进程:操作系统能够同时进行多个任务: 每个app(word,播放器,浏览器)可以同时运行
- 多线程:同一应用程序中哟多个顺序流同时执行
- 线程是进程中的一部分
1.2. 线程的执行过程:
主要过程:
多线程执行的抢CPU是不规律的,由虚拟机分配
1.3. 创建线程的方法
(1). 方法1:通过run()
- 定义一个线程类,它继承类Thread并重写其中的run()方法,方法run()成为线程体
- 由于Java只支持单继承,用这种方法定义的类不能继承其他类
class ThreadOne extends Thread{
public void run(){
for (int i=0; i<100;i++){
System.out.println("thread one--->" + i);
}
}
}
class ThreadTwo extends Thread{
public void run(){
for (int i=0; i<100;i++){
System.out.println("thread two--->" + i);
}
}
}
class Test{
public static void main(String[] args){
// 生成线程类的对象
ThreadOne fo = new ThreadOne();
ThreadTwo ft = new ThreadTwo();
// 启动线程---> 进入Runnable状态---->准备抢CPU
fo.start();
ft.start();
}
}
(2). 方法2: 复写Runnable接口(推荐)
- 提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实体,由该目标对象提供线程体
class RunnableImpl implements Runnable{
public void run(){
for (int i=0; i<100;i++){
System.out.println("thread two--->" + i);
}
}
}
class Test{
public static void main(String[] args){
//生成一个Runnable接口实现类的对象
RunnableImpl ri = new RunnableImpl();
//生成一个Thread对象,并将Runnable接口实现类的对象作为参数传递给该Thread对象
Thread t = new Thread(ri);
// 通知thread执行
t.start();
}
}
1.4. 线程的简单控制
- 中断线程
Thread.sleep()
:先睡眠,然后继续进入就绪状态,准备抢CPU----记得抛出异常哦,亲Thread.yield()
:让出CPU,然后继续进入就绪状态,准备抢CPU
- 设置线程的优先级:
getPriority()
: 获取优先级setPriority()
: 设置优先级(1-10)
2. Java线程同步synchronized
2.1. 多线程数据安全以及synchronized的使用
- 多线程共用同一份数据的时候,会出问题
class MyThread implements Runnable{
int i = 100;
public void run(){
while (true){
// 使用synchronized构造同步代码块---this为同步锁
synchronized(this){
// Thread.currentThread()获取当前代码正在哪个线程中运行
System.out.println(Thread.currentThread().getName() + i);
i = i -1;
Thread.yield();
if(i<0){
break;
}
}
}
}
}
class Test{
public static void main(String[] args){
MyThread myThread = new MyThread();
// 生成两个
Thread t1 = new Thread(myThread);
Thread t2 = new Thread(myThread);
t1.setName("thread a");
t2.setName("thread b");
// t1先获得锁,运行,t2等待
// t2然后获得锁,运行,t1等待
t1.start();
t2.start();
}
}
2.2. 深入synchronized关键字
- 同步锁不是锁的代码块,锁的是this, 只要一个对象获得同步锁,这个对象其他也含有同步锁的代码都不能执行,只能释放后才能执行
- 没有同步锁的代码块跟同步锁无关,会继续执行,没有影响
class Service {
public void fun1(){
synchronized(this){
try{
Thread.sleep(3*1000)
}
catch(Exception e){
System.out.println(e)
}
System.out.println("fun1")
}
}
public void fun2(){
synchronized(this){
System.out.println("fun2")
}
}
}
class MyThread1 implments Runnable{
private Service service;
public MyThread1(Service serivce){
this.serivce = serivce;
}
public void run(){
service.fun1();
}
}
class MyThread2 implments Runnable{
private Service service;
public MyThread2(Service serivce){
this.serivce = serivce;
}
public void run(){
service.fun2();
}
}
class Test{
public static void main(String[] args){
Service service = new Service();
Thread t1 = new Thread(new MyThread1(service));
Thread t2 = new Thread(new MyThread2(service));
}
}
2.3. 同步方法
- 同步方法锁住的是this
class Service {
// 同步方法只需要在方法名前加入synchronized即可
public synchronized void fun1(){
try{
Thread.sleep(3*1000)
}
catch(Exception e){
System.out.println(e)
}
System.out.println("fun1")
}
public void fun2(){
synchronized(this){
System.out.println("fun2")
}
}
}
3. Java的数组和类集框架
- 用于储存一些列相同数据类型的容器
3.1. 数组类型
- 数组长度一旦声明,不可更改
class Test{
public static void main(String[] args){
// 一维数组的静态声明法
int[] arr = {1,2,5,7,8,10};
arr[3] = 10; // 设置数组元素为新的值
// 打印一维数组元素
for (int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
// 一维数组的动态声明法
int[] arr = new int[10]; // 初始化为0
// 二位数组的静态声明法
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
arr[1][1]; // = 5
// 二位数组的动态声明法
int[][] arr = new int[3][5];
// 打印二位数组
for (int i=0; i<arr.length;i++){
for (int j=0; i<arr[i].length; i++){
System.out.println(arr[i][j]);
}
}
}
}
3.2. Java的类集框架
1. 类集框架的定义和种类,以及基础结构
- 类集框架是一组类和结构,位于java.util包中,主要用于储存和管理对象,主要分为三大类:
- 集合(Set): 对象不按照特定的方式排序,并且没有重复对象
- 列表(List): 对象按照索引位置排序,可以有重复对象
- 映射(dictionary): 通过键-值对储存(key-value)
类集框架的主体结构
2. ArrayList列表的使用
import java.util.List;
import java.util.ArrayList;
public class Test{
public static void main(String[] args){
// arraylist的长度可以自动扩展,跟数组有区别
// 声明arraylist只能存String类型
ArrayList<String> arraylist = new ArrayList<String>();
// 向arraylist数组添加对象
arraylist.add("a");
arraylist.add("b");
// 从arraylist取对象
String s = arraylist.get(1);
// 打印arraylist数据
for(int i=0; i<arraylist.size(); i++){
String s = arraylist.get(1);
System.out.println(s);
}
// 删除arraylist数据
arraylist(1);
}
}
3. Collection和Iterator接口
- Iterator最高层---
hasNext()
+Next()
- Collection接口是Iteator的子接口
- Set是Collection接口的子接口
- HashSet是Set的实现类
Iterator <-- Collection <-- Set <-- HashSet
Iterator <-- Collection <-- List <-- ArrayList
(1) Collection接口
方法 | 含义 |
---|---|
boolean add(Object 0) | 向集合添加对象 |
void clear() | 删除集合的所有对象 |
boolean isEmpty() | 判断集合是否为空 |
remove(Object o) | 从集合中删除一个对象的引用 |
int size() | 返回集合中元素的数组 |
4.Set和HashSet用法(Collection的实现类)
import java.util.Set;
import java.util.HashSet;
public class Test{
public static void main(String[] args){
HashSet<String> hashset = new HashSet<String>();
Set<String> set = hashset;
boolean b1 = set.isEmpty();
set.add("a");
set.add("b");
set.add("c");
set.add("a"); // 重复元素会忽略
int a = set.size();
set.remove(a);
set.clear();
// 集合取数据---通过迭代器Iterator
// 调用Set对象的Iterator方法,会生成一个迭代器对象,该对象用于遍历整个Set
Iterator<String> it = set.iterator();
while(it.hasNext()){
//取出元素,并将指针向后面挪一位
String s = it.next();
System.out.println(s);
}
}
}
5. Map和HashMap的使用方法
Map <-- HashMap
import java.util.Map;
import java.util.HashMap;
public class Test{
public static void main(String[] args){
// 创建hashmap对象,并定义键值对类型
HashMap<String, String> hasMap = new HashMap<String, String>();
Map<String, String> map = hasMap;
map.put("1","a");
map.put("2","b");
map.put("3","c");
map.put("3","e"); // 将会覆盖上面的键值对
int i = map.size();
String s = map.get("3");
}
}
4. equals
函数的使用方法
4.1. equals的作用
==
的作用:
- 基本数据类型: 是否相等?
- 引用数据类型: 是否指向堆内存的同一地址?
class User{
String name;
int age;
}
class Test{
public static void main(String[] args){
User u1 = new User();
User u2 = new User();
User u3 = u1;
boolean b1 = u1 == u2; // false
boolean b2 = u1 == u3; // true
}
}
eqauls的复写
- 两个对象类型相同(使用instanceof来比较)
- 两个对象的成员变量的值完全相同
class User{
// String是引用数据类型
String name;
int age;
public User(String name, int age){
this.name = name;
this.age = age;
}
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj instanceof User){
User u = (User)obj;
// 这里的equals是Object的
// equals用于比较内容是否相等
if (this.age == u.age && this.name.equals(u.name)){
return true;
}
else{
return false;
}
}
else{
return false;
}
}
}
class Test{
public static void main(String[] args){
User u1 = new User("zahng",12);
User u2 = new User("liu",15);
User u3 = new User("zahng",12);
boolean b1 = u1.equals(u2); // false
boolean b2 = u1.equals(u3); // true
}
}
Java高级教程02的更多相关文章
- Java入门 - 高级教程 - 02.集合
原文地址:http://www.work100.net/training/java-collection.html 更多教程:光束云 - 免费课程 集合 序号 文内章节 视频 1 概述 2 集合接口 ...
- 【Java学习系列】第3课--Java 高级教程
本文地址 可以拜读: 从零开始学 Java 分享提纲: 1. Java数据结构 2. Java 集合框架 3. Java泛型 4. Java序列化 5. Java网络编程 6. Java发送Email ...
- Java高级教程:Java并发性和多线程
Java并发性和多线程: (中文,属于人工翻译,高质量):http://ifeve.com/java-concurrency-thread-directory/ (英文):http://tutoria ...
- Java高级教程
目录 1.Java面向对象方法 1.1. 创建类和对象的方法 1.2. this的使用 1.3. 静态域和静态方法 1.3.1. 静态域:属于类的级别 1.3.2.静态常量 1.3.3 静态方法 1. ...
- 这是一套Java菜鸟到大牛的学习路线之高级教程,由工作了10年的资深Java架构师整理。
这是一套Java菜鸟到大牛的学习路线之高级教程,由工作了10年的资深Java架构师整理. 01-java高级架构师设计-基础深入 J2SE深入讲解 Java多 ...
- Java自动化测试框架-02 - TestNG之理论实践 - 纸上得来终觉浅,绝知此事要躬行(详细教程)
理论 TestNG,即Testing, NextGeneration,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用 ...
- Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍
本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...
- ios cocopods 安装使用及高级教程
CocoaPods简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm.随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的 ...
- 2017最新技术java高级架构、千万高并发、分布式集群、架构师入门到精通视频教程
* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...
随机推荐
- C# Parallel用法
1.Parallel.Invoke 主要用于任务的并行 这个函数的功能和Task有些相似,就是并发执行一系列任务,然后等待所有完成.和Task比起来,省略了Task.WaitAll这一步,自然也缺少了 ...
- WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件.例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开.在这个过程中,控 ...
- innodb mvcc实现机制
多版本并发控制 大部分的MySQL的存储 引擎,比如InnoDB,Falcon,以及PBXT并不是简简单单的使用行锁机制.它们都使用了行锁结合一种提高并发的技术,被称为MVCC(多版本并 发控制).M ...
- 三个线程T1,T2,T3.保证顺序执行的三种方法
经常看见面试题:有三个线程T1,T2,T3,有什么方法可以确保它们按顺序执行.今天手写测试了一下,下面贴出目前想到的3种实现方式 说明:这里在线程中我都用到了sleep方法,目的是更容易发现问题.之前 ...
- awk、nawk、mawk、gawk的简答介绍
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出(即管道).它支持用户自定义函数和 动态正则表达式等先进功能,是linu ...
- 关于 Socket 设置 setSoTimeout 误用的说明
做网络开发的想必对setSoTimeout这个方法很熟悉,知道是设置的超时事件.但是很多人都认为这个是设置链路的超时时间,但是查看相关文档的此方法的说明: HttpConnectionParams: ...
- 【20190219】CSS-知识点整理:float、em、浏览器的渲染过程
一.float与absolute 昨天看到一篇博客总结CSS中的一些关键知识点,里面对float元素进行了比较深入的解析,才发现我之前对float的理解不到位.float实际上最初的目的是为了实现图片 ...
- 【机器学习基本理论】详解最大后验概率估计(MAP)的理解
[机器学习基本理论]详解最大后验概率估计(MAP)的理解 https://blog.csdn.net/weixin_42137700/article/details/81628065 最大似然估计(M ...
- 如何用ABP框架快速完成项目(5) - 用ABP一个人快速完成项目(1) - 使用代码生成器
用ABP一个人快速完成项目有如下要点: 站在巨人的肩膀上 - 使用代码生成器 站在巨人的肩膀上 - 使用成熟控件框架, 一个框架不够就上两个, 两个不够就上三个 通过微服务模式而不是盖楼式来避免难度升 ...
- Mysql 用户和权限
创建用户 CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码'; 删除用户 DROP USER '用户名'@'localhost'; 权限列表 ALL 或 ...