java高级教程_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
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
for (int j=0; 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 arraylist = new ArrayList();
// 向arraylist数组添加对象
arraylist.add("a");
arraylist.add("b");
// 从arraylist取对象
String s = arraylist.get(1);
// 打印arraylist数据
for(int i=0; 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
Iterator
(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 hashset = new HashSet();
Set 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 it = set.iterator();
while(it.hasNext()){
//取出元素,并将指针向后面挪一位
String s = it.next();
System.out.println(s);
}
}
}
5. Map和HashMap的使用方法
Map
import java.util.Map;
import java.util.HashMap;
public class Test{
public static void main(String[] args){
// 创建hashmap对象,并定义键值对类型
HashMap hasMap = new HashMap();
Map 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高级教程_Java高级教程02相关推荐
- 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)
黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...
- java反射教程_Java反射教程
java反射教程 在本教程中,我主要编写一些示例来介绍Java反射可以做什么. 希望它可以给您这个概念的概述. 请留下您的评论以寻求建议. 什么是反射? 简而言之,反射是程序在运行时检查和修改对象的结 ...
- java捕鱼设计_JAVA毕业设计教程:用swing实现捕鱼达人代码教程
用JAVA SWING实现的捕鱼教程 开发工具:ECLIPSE 实现技术:JAVA SWING 用到的JAR包:xmlpull_1_1_3_4c.jar.dom4j-1.6.1.jar.jl1.0.j ...
- java高级框架应用开发案例教程_Java高级框架应用开发案例教程:struts2+spring+hibernate PDF...
资源名称:Java高级框架应用开发案例教程:struts2+spring+hibernate PDF 第1章 struts+spring+hibernate概述 1.1 框架概述 1.2 struts ...
- java swing 下载_JAVA Swing 教程
JAVA Swing 教程,包含所有练习源码和讲解教程! 初级界面篇 练习01分解颜色 练习02画板 练习03帧 练习04画布 练习05密码验证界面 练习06对话框 练习07滚动条 练习08边框 练习 ...
- java 2d 绘图教程_Java标准教程:Java 2D绘图--第2章 从绘图开始
Java标准教程:Java 2D绘图--第2章从绘图开始 Java 2D API是强大并且复杂的.然而,大多数Java 2D API只用到了封装在java.awt.Graphic类中的功能的自己.本节 ...
- java设计模式教程_Java设计模式教程
java设计模式教程 课程大纲 架构和计算机科学中的设计模式是记录特定专业领域中设计问题的解决方案的正式方法. 这个想法是由建筑师Christopher Alexander在建筑领域引入的,并已被修改 ...
- java joinpoint教程_Java的教程
Java编程语言 Java编程语言中,左侧的导航栏(Java编程语言),可以快速定位文章的内容.这篇文章主要汇总以下: Java编程语言学习:Java的概述,Java的基础,Java面向对象的概念,J ...
- java窗口代码_Java系列教程day01——java的搭建环境
day01--搭建环境变量&HelloWorld程序 1.注意听课,不要溜号,不要睡觉,不要游戏. 2.我的联系方式: QQ:79539705 3.整理笔记.绘制思维导图.完成作业.. 一.J ...
最新文章
- 对DataSet,DataRow,DateTable转换成相应的模型
- 史上最好记的神经网络结构速记表(上)
- Spring MVC –揭秘了@RequestBody和@ResponseBody
- innodb_rollback_on_timeout
- 1.1 linux介绍
- JVM 大厂面试都会问,都会这么问,你能顶住么?
- [20171120]bash使用here documents的细节
- 凸集、锥、凸锥、正常锥的辨析
- WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选)
- ansys经典界面分析工字钢_【干货】基于ANSYS经典界面的接触分析例子
- 小米5x 运行linux,小米5X root+xposed使用方法
- matlab定义对角块矩阵,Matlab中的扩展块对角矩阵
- Codeforces918 D. MADMAX(博弈,记忆化搜索)
- 软件测试整理:测试设计
- win10系统下忘记登录密码最简单重置方法(无需U盘),本人实践!
- 配置SQL Server的ODBC数据源
- 手把手教你做一块电路板,从设计到制作
- 【Proteus仿真】6位数码管计时器(0-10^5)
- python 处理超大文件
- win10 explorer导致闪屏的解决方案
热门文章
- php拼接xml特殊字符不显示,使用PHP的XML特殊字符
- java range类_Java即时类| range()方法与示例
- 火狐最实用的几款插件介绍[含附件]
- 怎样使用orapwd新建口令文件
- 第四章语法分析和语法分析程序
- python RSA加密、解密、签名
- 爬山法实现 八皇后问题 (Python 实现)
- python关键字的意思_python 关键字(Keywords)
- Linux复制文件到usb设备中,使用shell脚本实现USB设备的加载与文件复制
- win10安装misql8_Windows10安装MySQL 8.0.11