1.线程
进程是一个可以独立运行的程序单位,线程就是一个轻量级的进程。
自定义线程的方法:
1.继承Thread类,重写Thread类中的run方法,创建继承类对象,调用线程的start()方法。
2.实现Runnable接口,重写run方法,创建实现类对象,创建线程类对象,调用线程的start()方法。
线程的5种状态:
新建、就绪、运行、阻塞、结束
当我们创建一个线程对象的时候,该线程就进入新建状态,当我们调用线程的start方法,线程进入就绪状态,等待CPU分配时间片运行,当获取到 CPU时间片的时候,代码开始执行,进入运行状态。当运行时候我们调用sleep、join、yeild、join,还有其他一些方式导致改程序暂停运行就进入了阻塞状态,当阻塞结束后又进入就绪状态,然后进入运行状态,程序执行完成后该线程进入结束状态,然后等到CPU回收该内存。
线程方法详解:
1、setPriority(int newPriority)设置线程优先级,我们可以通过此方法设置线程的优先级,优先级越高获取时间片的概率就越大。
2、join() join(long millis) join(long millis, int nanos) ,线程合并,合并外部的线程,然后等待外部线程执行完毕后,在执行当前线程。
3、yield方法,就是线程让行的意思,本来该我获取时间片了,但是我不获取,让给别人去获取,我在获取下一次
4、wait和notify
wait方法:
wait()和wait(timeout) 第一个是一直进入等待状态, 第二个是进入等待状态,到时间自己往下 notify 和我们的wait是组合使用:
synchronized (Account.o) {
System.out.println(“输入密码”);
if( Account.balence>=200) {
System.out.println(name + “取钱200走了”);
Account.balence -= 200;
}else {
System.out.println(name + “余额不足!没法取钱”);
}
try {
Account.o.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true) {
1
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (Account.o) {
Account.o.notify();
}
}
Thread本身提供了一个stop方法,但是这个方法很不安全,我们不推荐使用这个方法,因为一般的线程都是一个循环体, 所以我们通过标志位 来结束循环达到结束线程目的
多线程:
多线程是一个进程中同时有多个线程正在执行。
在一个程序中,有很多操作是非常耗时的,如数据库的读写,IO操作等,如果用单线程就必须把这些操作执行完成后才能进行下面的操作,而用了多线程以后,就可以把这些程序放在后台的继续执行,同时执行其他的操作。可以提高程序的效率。多线程在高并发问题中可以充分利用计算机资源。
线程并发:所谓的线程并发就是当我们多个程序操作同一个资源的时候,会造成资源重复操作。
解决方案就是加锁,synchronized 另外一种方式是队列
类锁:
synchronized (Ren.class) {
System.out.println("输入密码");
if( Account.balence>=200) {
System.out.println(name + "取钱200走了");
Account.balence -= 200;
}else {
System.out.println(name + "余额不足!没法取钱");
}
System.out.println("取钱结束,余额为:" + Account.balence);
}
对象锁:
public void run() {
synchronized (Account.o) {
System.out.println("输入密码");
if( Account.balence>=200) {
System.out.println(name + "取钱200走了");
Account.balence -= 200;
}else {
System.out.println(name + "余额不足!没法取钱");
}
System.out.println("取钱结束,余额为:" + Account.balence);
}
}
方法锁:
public synchronized void run() {
System.out.println("输入密码");
if( Account.balence>=200) {
System.out.println(name + "取钱200走了");
Account.balence -= 200;
}else {
System.out.println(name + "余额不足!没法取钱");
}
System.out.println("取钱结束,余额为:" + Account.balence);
}
线程异步:所谓的异步就是多个线程同时操作,有可能会操作到同一个资源,这样就会形成我们的资源误操作,这种方式效率高,速度快,不安全,容易资源误操作 。
线程同步:多个线程一起运行,但是后面的线程必须等前面的线程运行完成以后才能运行,效率低下,速度慢,安全。
2.IO流
IO流技术主要是解决数据存储到硬盘的操作
一种叫做写到硬盘上 : output
一种从硬盘读取::input
IO流就是操作数据的两种方式
输入流,InputStream == >FileInputStream
package com.test.io1;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 在E盘下 创建文件路径如下 E:/file/src/info.txt;
* @author Administrator
*/
public class TestIo {
public static void main(String[] args) {
//文件输入流
String num = "0";
try {
// FileInputStream fis = new FileInputStream("E:/info.txt");
File file = new File("E:/info.txt");
FileInputStream fis = new FileInputStream(file);
byte b[] = null;
try {
System.out.println(fis.available());
b = new byte[fis.available()];
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
fis.read(b);
String s = new String(b);
System.out.println(s);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
文件夹以及文件的创建类: File(注意需要先创建文件夹再创建文件)
package com.test.io1;
import java.io.File;
import java.io.IOException;
public class TestFile {
public static void main(String[] args) {
//创建文件夹
File file = new File("E:/file/src");
file.mkdirs();
//创建文件
File file2 = new File("e:/file/src/info.txt");
try {
file2.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
java对象流,存取对象:
ObjectInputStream、FileOutputStream。 存储的是java的对象形式的数据,前提是该对象的类必须被序列化
public class Map implements Runnable, Serializable{
}
字符串流:
java字符流是Reader、Writer、通过我们查询API发现,该字符串流是无法直接获取硬盘文件的,需要借助我们的字节输入流和字节输出流来进行文件获取,所以代码如下:
try {
//利用字节流关联文件
InputStream is = new FileInputStream("e:/a.txt");
//将字节流套入我们基础字符流
InputStreamReader isr = new InputStreamReader(is);
//将基础字符流套入高级字符流
BufferedReader br = new BufferedReader(isr);
System.out.println(br.readLine());
} catch (Exception e) {
// TODO: handle exception
}
try {
OutputStream os = new FileOutputStream("e:/a.txt",true);
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("张三你好");
bw.close();
osw.close();
os.close();
} catch (Exception e) {
// TODO: handle exception
}
3.如何打包成可安装 exe 程序
第一步:把java文件打包成class文件包,把java工程打包成jar文件
直接利用eclipse完成打包:
项目右键 – export – 依次操作
完成之后我们会得到一个jar文件,这个jar文件就是我们java编译过后的class的压缩包
第二步: 把jar文件打包成可运行的exe。 需要利用exe4j工具。
官网下载地址:https://exe4j.apponic.com/
第三步:把可运行的exe打包成可安装exe,需要利用inno setup软件进行打包,注意,这个然间使用很复杂, 所以操作的时候注意每一步的细节。