Java基础的详细了解第八天攻略
一、多线程
1. 线程的创建(继承Thread类)
Java中创建线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。第一种方式的具体代码如下:
class MyThread extends Thread {
@Override
public void run() {
// 线程要执行的代码
}
}
其中,run方法中写的是线程要执行的代码。线程启动,只需要创建一个MyThread的实例,并调用start()方法即可。
MyThread thread = new MyThread();
thread.start();
2. 线程的创建(实现Runnable接口)
另外一种创建线程的方式是实现Runnable接口。具体代码如下:
class MyRunnable implements Runnable {
@Override
public void run() {
// 线程要执行的代码
}
}
同样,线程启动也只需要创建一个MyRunnable实例,并调用start()方法即可。
MyRunnable r = new MyRunnable();
Thread thread = new Thread(r);
thread.start();
3. 线程的生命周期
线程的生命周期包括6个状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)和终止(Terminated)。
其中,新建状态指线程创建后还未调用start()方法的状态;就绪状态指线程调用start()方法后,等待CPU资源的状态;运行状态指CPU正在执行该线程的状态;阻塞状态指线程由于某些原因(如获取锁失败、IO操作等)暂时停止执行的状态;等待状态指线程进入等待状态后,需要等待其他线程的通知才能继续执行;终止状态表示线程执行完毕的状态。
4. 线程同步
线程同步是指非常多线程访问共享资源时的一种机制。
Java中提供了synchronized关键字和Lock接口实现线程同步,其实现机制是通过对象的锁来保护关键代码块避免多线程对共享资源的争抢。
class SynchronizedDemo {
private int count = 0;
public synchronized void add() {
count++;
}
}
在上述代码中,add()方法被synchronized修饰,同步加锁,就可以保证同时最多只有一个线程可以执行该方法。
5. 线程池
线程池主要解决线程生命周期(线程的创建、销毁)开销大,线程数量过多导致系统负载过重等问题。线程池可以将大量任务分给少量线程处理,处理完成后,线程不会被销毁,而是继续保留在池中等待下一次使用。
Java中提供了ThreadPoolExecutor类实现线程池,其具体代码如下:
ExecutorService executorService = new ThreadPoolExecutor(5, 10,
60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
其中,参数的意义分别为:线程池核心线程数、线程池最大线程数、线程池空闲线程存活时间、单位时间、阻塞队列。
在使用时,只需要将Runnable任务提交到线程池中即可:
executorService.execute(new MyRunnable());
二、输入输出流
1. Java IO概述
Java IO是指Java的输入输出,负责程序与外界的交流。Java中的IO系统分为三个部分:字节流、字符流、输入/输出流(包括控制台输入输出和文件输入输出)。
Java中的IO操作以字节为单位,即每个创建的字节流对应一个8位二进制字节序列,而输入/输出操作都是基于流的。
2. 字节流
字节流是Java IO操作中的第一种流,用于操作二进制文件,输入输出操作以字节为单位。
Java中的字节流共包含4个类:InputStream/BufferedInputStream/FileInputStream和OutputStream/BufferedOutputStream/FileOutputStream。
例如,使用FileInputStream读取二进制文件代码如下:
FileInputStream fis = null;
try {
fis = new FileInputStream("file.bin");
int n = -1;
while ((n = fis.read()) != -1) {
// 处理字节数组
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
3. 字符流
字符流用于操作文本文件,输入输出操作以字符为单位,一次可以读取多个字符。
Java的字符流共包含4个类:Reader/BufferedReader/FileReader和Writer/BufferedWriter/FileWriter。
例如,使用FileReader读取文本文件并输出文件内容的代码如下:
FileReader fr = null;
try {
fr = new FileReader("file.txt");
int n = -1;
while ((n = fr.read()) != -1) {
// 处理字符
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fr != null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
以上是Java基础的详细了解第八天的攻略,其中包括了多线程和输入输出流两部分内容,希望可以帮助到学习Java的同学们。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java基础的详细了解第八天 - Python技术站