Java高级教程02

Wesley13
• 阅读 552

[TOC]

1.Java线程

1.1. 多线程和多进程

  • 多进程:操作系统能够同时进行多个任务: 每个app(word,播放器,浏览器)可以同时运行
  • 多线程:同一应用程序中哟多个顺序流同时执行
  • 线程是进程中的一部分

1.2. 线程的执行过程:

Java高级教程02

主要过程:

Java高级教程02

多线程执行的抢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)

类集框架的主体结构

Java高级教程02

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 } }

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这