java高级教程_Java高级教程02

1.Java线程

1.1. 多线程和多进程

多进程:操作系统能够同时进行多个任务: 每个app(word,播放器,浏览器)可以同时运行

多线程:同一应用程序中哟多个顺序流同时执行

线程是进程中的一部分

1.2. 线程的执行过程:

83678649c4bf19634d4c74d400bcc286.png

主要过程:

498a19ab3fccdd90904b1681288b6575.png

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

类集框架的主体结构

c3dd9c339cc93073c2aa7fdfdd0b3b93.png

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

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode刷题笔记】动态规划(二)

647. 回文子串 解题思路: 1. 暴力穷举 , i 遍历 [0, N) , j 遍历 [i+1, N] ,判断每一个子串 s[i, j) 是否是回文串,判断是否是回文串可以采用 对撞指针 的方法。如果是回文串就计数 +1

数据结构 排序 java_Java数据结构之排序---选择排序

简单选择排序的介绍&#xff1a;从给定的序列中&#xff0c;按照指定的规则选出某一个元素&#xff0c;再根据规定交换位置后达到有序的目的。简单选择排序的基本思想&#xff1a;假定我们的数组为int [] arr new int[n]&#xff0c;第一次我们从arr[0]~arr[n-1]中选择出最小的…

python百度aip移动目标监控系统_python利用百度云接口实现车牌识别

一个小需求---实现车牌识别。目前有两个想法调云在线的接口或者使用SDK做开发(配置环境和编译第三方库很麻烦&#xff0c;当然使用python可以避免这些问题)自己实现车牌识别算法(复杂)&#xff01;一开始准备使用百度云文字识别C SDK来做&#xff0c;发现需要准备curl、jsoncpp…

centos tar安装mysql_centos系统通过tar.gz包安装mysql5.7.19

系统&#xff1a;centos6.5 64位系统1、下载mysql本人选的linux generic 通用版 64位2、把mysql传到服务器并解压到/usr/localtar -xzvf mysql-5.7.19-linux-glibc2.12-x86_64.tar -C /usr/local3、进入/usr/local目录:cd /usr/local4、为mysql安装目录创建软链接ln -s mysq…

aqs clh java_【Java并发编程实战】----- AQS(一):简介

在前面博客中&#xff0c;LZ讲到了ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch&#xff0c;他们都有各自获取锁的方法&#xff0c;同时相对于Java的内置锁&#xff0c;他们具有明显的优势&#xff1a;花最小的空间开销创建锁、最少的时间开销获得锁、使…

gitlab ci 配置 java_GitLab CI/CD 配置

GitLab CI/CD 配置概念操作示例创建测试项目 sample-web&#xff0c;然后打开项目的 Runners 配置找到这个地方&#xff0c;后边要用然后搭建 gitlab-runner&#xff0c;CI/CD 需要通过它实现# 创建 gitlab-runner 目录mkdir -p /usr/local/gitlab-runner && cd /usr/l…

java失败javac成功_JAVA SE JDK-10安装、配置(解决java成功,javac失败问题)

本文是在win10环境下安装JDK-10在linux环境下安装JDK-10请点击&#xff1a;CentOS 7 安装、配置JDK-101、下载JDK包点击打开下载网站点击图中的Accept License Agreement&#xff0c;再选择Win版本进行下载2、安装JDK包下载完毕&#xff0c;运行安装程序修改安装路径(这里选择的…

java搭建聊天服务器_使用 ServerSocket 建立聊天服务器-2

1.从serverListener中可以看出,每一个客户端创建新的请求之后,都会把它分配给一个独立的chatsocket ,但是每一个ChatSocket都是相互独立的,他们之间并不能沟通,所以要新建一个类,将这些新建的线程管理起来,然后实现他们之间的相互通信.(类似于微信加群聊天的功能)由于一个聊天服…

lavarel php区别,laravel中{{}}和{!! !!}的区别详解

本篇文章介绍了laravel中{{}}和{!! !!}的区别&#xff0c;感兴趣的朋友可以参考下。laravel中{{}}和{!! !!}的区别详解1.{{}}和{!! !!} 中{{}}支持转义 一段html代码只是被当成普通的字符串输出 &#xff0c;{!! !!} 不支持转义 一段html代码可以被正常的解析1.2具体什么意思呢…

php获取ios,IOS 通过描述获取UDID PHP代码版

难点在于PHP对XML的解析文件结构&#xff1a;第一步&#xff1a;新建HTML文件 用于跳转安装描述文件 必须在safari里面打开地址第二步&#xff1a;新建udid.mobileconfig文件PayloadContentURLhttps://www.xxx.com/pay_super/receive.phpDeviceAttributesUDIDIMEIICCIDVERSIONP…

matlab如何读取csv,Matlab:如何读取CSV文件以及如何读取带有字符串数据项的CSV文件 | 学步园...

CSV&#xff0c;逗号分开的文件&#xff0c;如果能快速的读取这些文件中的数据&#xff0c;无疑会帮助我们解决很多问题。1、 只有数据的CSV文件&#xff0c;CSV file that includes only numbers.As an example, create a text file, named as data.csv if you prefer, which …

url中隐藏php后缀,url中如何隐藏.php

url中隐藏“.php”的方法&#xff1a;首先找到并打开“nginx.conf”配置文件&#xff1b;然后添加内容“location / {ttry_files $uri $uri/ $uri.php$is_args$args;}”&#xff1b;最后保存修改即可。推荐&#xff1a;《PHP视频教程》现在很多人都喜欢用nginx作为Web服务器部署…

discuz手机客户端java,Discuz!7.2让高级搜索更全面

Discuz! 7.2 调整了对帖子的高级搜索&#xff0c;使高级搜索的搜索选项更细化&#xff0c;覆盖面更广。一、高级搜索功能介绍高级搜索界面如下图所示&#xff1a;1、按作者&#xff1a;此处可以填写发帖作者全名&#xff0c;也可以使用通配符"*"&#xff0c;如填写&q…

php面向对象异常处理,PHP 错误和异常处理(下)

PHP 错误和异常处理(下)由 学院君 创建于9个月前, 最后更新于 7个月前版本号 #11723 views2 likes0 collects上篇我们讲了 PHP 中的错误报告和捕获&#xff0c;今天&#xff0c;我们来看看 PHP 程序中的异常处理。错误 vs. 异常错误与异常可以看作一对孪生兄弟&#xff0c;从严…

电脑运行java游戏,电脑运行软件卡顿?这几招游戏或是办公,让你速度飞起!...

许多朋友想知道他们已经购买了高端计算机&#xff0c;但是无论玩游戏还是运行软件&#xff0c;他们仍然陷于困境。今天&#xff0c;让我们教大家一个简单的方法来提高计算机性能。焦点&#xff1a;此方法大大提高了用户对高度配置的计算机的影响。如果计算机的设置不太高&#…

c matlab 数据类型,matlab中数据类型与c语言数据类型的区别?

matlab中数据类型与c语言数据类型的区别&#xff1f;mip版 关注:233 答案:3 悬赏:0解决时间 2021-02-23 08:46已解决2021-02-22 22:32matlab中数据类型与c语言数据类型的区别&#xff1f;最佳答案2021-02-22 22:42简单谈一下。1.好多类型是对应的。输入一个数&#xff0c;ma…

oracle数据库安装提示M,Python第13课:oracle数据库的安装

Python第13课&#xff1a;oracle数据库的安装时间 2019-01-22下午4&#xff1a;30主讲 罗恒丰地点 四楼电教室版本&#xff1a;11.2大小&#xff1a;2.06G安装文件在专班ftp里python安装文件的文件夹。一.找到 stage/cvu/cvu_prereq.xml &#xff0c;编辑系统名&#xff0c;以适…

linux 文件怎么不让删,请问如何设置权限,可以禁止用户删除文件

原帖由 WHITLACK 于 2009-9-28 08:48 发表 针对某个文件&#xff0c;如何设置权限&#xff0c;可以禁止删除&#xff1f;文件权限的r-w-x好像不能禁止删除的啊&#xff0c;谢谢指教&#xff01;1:使用粘滞位可以做到,下面是介绍.强制位与冒险位、粘滞位针对u&#xff0c;g&…

linux运行中望cad,国产CAD软件中望的Linux版适配UOS, 我在国产系统里试了试

可能大家都知道&#xff0c;以往我们在国产操作里运行的软件&#xff0c;很多都是国外开源的软件。在以前很长一段时间里&#xff0c;国产操作中&#xff0c;国内企业很少去适配的。据说&#xff0c;国产深度之所以有很多国产软件&#xff0c;其中一个原因就是他们一家一家去拜…

linux内核死锁检测机制 | oenhan,Linux内核CPU负载均衡机制 | OenHan

还是神奇的进程调度问题引发的&#xff0c;参看Linux进程组调度机制分析&#xff0c;组调度机制是看清楚了&#xff0c;发现在重启过程中&#xff0c;很多内核调用栈阻塞在了double_rq_lock函数上&#xff0c;而double_rq_lock则是load_balance触发的&#xff0c;怀疑当时的核间…