6.5号笔记

6.5日java笔记

object类

toString方法

该方法用得比较多,一般子类都有覆盖,来获取对象的信息。

equals方法

比较对象的内容是否相等

data类跳过

Calendar类

如何得到一个日历对象呢?
Calendar c = Calendar.getInstance();//返回的是子类对象
System类的概述

System 类

包含一些有用的类字段和方法。它不能被实例化。
成员方法
public static void gc() //运行垃圾回收器,只有垃圾回收期运行Object类中的finalize方法,才能回收掉垃圾

public static void exit(int status) //终止正在运行的java虚拟机

public static long currentTimeMillis() //返回当前时间与协调世界时1970年1月1日午夜之间的时间差,常用于计算程序运行的时间

pubiic static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) //从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

StringBuilder类

线程不安全,可变,提供了用于编辑字符串的相关方法,包括增删改插
StringBuilder builder=new StringBuilder(str);
builder.replace(9,16,“就是为了改变世界”);//替换
str=builder.toString();
System.out.println(str);
builder.delete(0,8);//删除
System.out.println(builder.toString());
builder.insert(0,“活着”);//活着就是为了改变世界
System.out.println(builder.toString());
builder.append("!");//追加
System.out.println(builder.toString());
builder.reverse();
System.out.println(builder.toString());//翻转字符串

Collection集合

在这里插入图片描述

异常

程序开发和运行过程中会出现编译错误和运行错误。编译错误容易被发现并排除,而运行错误(逻辑错误和异常)很难预料。因此为了程序的稳定性和可靠性,就需要对程序异常处理和保护。

异常( Exception ):正常程序流程所不能处理或者没有处理的异常情况或异常事件。
<1>可以由Java虚拟机在执行程序时自动发现并产生异常。
<2>也可以在程序中显式地生成异常,这种方法称为抛出异常(ThrowExceptions)。抛出异常采用throw语句,格式如下:
throw new ArithmeticException( );
或者:
ArithmeticException e=new ArithmeticException( );
throw e;

进程与线程

  1. 进程
    进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。

  2. 线程
    线程是一条执行路径,是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

一个正在运行的软件(如迅雷)就是一个进程,一个进程可以同时运行多个任务( 迅雷软件可以同时下载多个文件,每个下载任务就是一个线程), 可以简单的认为进程是线程的集合。

线程是一条可以执行的路径。多线程就是同时有多条执行路径在同时(并行)执行。

  1. 进程与线程的关系
    一个程序就是一个进程,而一个程序中的多个任务则被称为线程。进程是表示资源分配的基本单位,又是调度运行的基本单位。,亦即执行处理机调度的基本单位。 进程和线程的关系:

一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。

资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量,即每个线程都有自己的堆栈和局部变量。

处理机分给线程,即真正在处理机上运行的是线程。

线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

进程同步机制基础概念

为何要引入进程同步机制
首先来明确一下,为什么要引入进程间的同步?由于操作系统中的进程是并发的,因此当协同进程对共享数据进行访问时,可能会造成数据的不一致性问题。为了保证数据的一致性,那么我们就需要一种有效地机制,这就是被我们称之为的进程同步机制。

进程间资源访问冲突的类型
进程间资源访问的冲突主要有两种类型,分别为

  • 共享变量的访问冲突
  • 访问顺序的冲突
    对于共享变量的访问冲突,我们解决的方式就是进程的互斥,而对于进程间访问顺序的冲突,我们解决的方式就是进程的同步。

同步机制遵循的原则
进程间同步机制遵循一套规范化的原则,由于中文教材和英文教材存在一定的差异,以下的分析以英文教材为主:

Mutual Exclusion.(互斥). 如果进程Pi在其临界区执行,那么其他进程如Pj将被排斥在临界区之外;
Progress.(有空让进). 当没有进程进行临界区执行时,允许任何进程申请进入临界区;
Bounded Waiting.(有限等待). 任何进程进入临界区的等待时间都是有限的。
看完了上述的分析,我们需要明确的一点是,什么是临界区:对于临界资源,系统必须互斥地对其进行访问。那么临界区就是进程中访问临界资源的一段代码。

进程间同步互斥机制
进程间实现互斥访问,大体上似乎可以分为两种方式:

轮流
申请
轮流也就是每个进程都有一段进入临界区的机会,但单纯出于轮流的考虑,可以满足互斥的条件,但是无法满足有空让进(某进程使用完后无法再在下一轮使用);同理,单纯通过申请的方式也不能满足有空让进(两进程彼此更改flag形成死锁)。

那么直观的现象是什么呢,这便是轮流加申请,实现的伪代码如下:

do {
flag[i] = true;
turn = j;
while (flag[j] && turn == j);

    critical section

flag[i] = false;

    remainder section

} while (true);
1
2
3
4
5
6
7
8
9
10
11
12
通过简单的分析,我们可以看到,使用轮流与申请这两种方式就可以实现进程间同步。

但是,我们不得不看到该方法存在着突出问题:一方面如果进程数量太多,那么控制逻辑相对过于复杂;另外一方面可能造成进程轮转一周但是没有进入临界区进程的情况,导致了资源的浪费。

等待唤醒机制

什么是等待唤醒机制
这是多个线程间的一种协作机制。谈到线程我们经常想到的是线程间的竞争(race),比如去争夺锁,但这并不是故事的全部,线程间也会有协作机制。就好比在公司里你和你的同事们,你们可能存在在晋升时的竞争,但更多时候你们更多是一起合作以完成某些任务。就是在一个线程进行了规定操作后,就进入等待状态(wait()), 等待其他线程执行完他们的指定代码过后 再将其唤醒(notify());在有多个线程进行等待时, 如果需要,可以使用 notifyAll()来唤醒所有的等待线程。wait/notify 就是线程间的一种协作机制。
等待唤醒中的方法
等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下:

wait:线程不再活动,不再参与调度,进入 wait set 中,因此不会浪费 CPU 资源,也不会去竞争锁了,这时的线程状态即是WAITING。它还要执行一个特别的动作,也即是“通知(notify)”在这个对象上等待的线程从wait set 中释放出来,重新进入到调度队列(ready queue)中
notify:则选取所通知对象的 wait set 中的一个线程释放;例如,餐馆有空位置后,等候就餐最久的顾客最先入座。
notifyAll:则释放所通知对象的 wait set 上的全部线程。

调用wait和notify方法需要注意的细节

wait方法与notify方法必须要由同一个锁对象调用。因为:对应的锁对象可以通过notify唤醒使用同一个锁对象调用的wait方法后的线程。
wait方法与notify方法是属于Object类的方法的。因为:锁对象可以是任意对象,而任意对象的所属类都是继承了Object类的。
wait方法与notify方法必须要在同步代码块或者是同步函数中使用。因为:必须要通过锁对象调用这2个方法。

线程池

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。
假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。

如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。
一个线程池包括以下四个基本组成部分:
1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

File类

File类操作目录与文件的常用方法有哪些
文件方法:
对象名.createNewFile()//创建新文件。
对象名.delete()//直接从磁盘上删除
对象名.exists()//查询磁盘中的文件是否存在
对象名.getAbsolutePath()//获取绝对路径
对象名.getPath()//获取相对路径
对象名.getName()//获取文件名 相当于调用了一个toString方法。
对象名.isFile()//判断是否是文件
对象名.length()//查看文件中的字节数
目录方法:
对象名.exists()//查询目录是否存在
对象名.isDirectory()//查询文件文件夹是否存在
对象名.isFile()//查询文件是否存在
对象名.mkdir()//创建单层目录
对象名.mkdir()//创建多层目录
对象名.delete()//删除目录
对象名.getParentFile()//获取cc目录的父级目录。
对象名.list()//返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
对象名.listFiles//返回一个字符串。命名由此抽象路径名表示的目录中的文件和目录。可以获取相对路径和绝对路径,可以对文件进行操作。

1、FilenameFilter接口:boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。

参数:dir- 被找到的文件所在的目录。name- 文件的名称。

返回:当且仅当该名称应该包含在文件列表中时返回true;否则返回false。

2、FileFilter接口:boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。

参数:pathname- 要测试的抽象路径名

返回:当且仅当应该包含pathname 时返回 true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值