好的,以下是一本markdown格式的Java多线程编程学习笔记,其中涵盖了基本概念、线程安全、线程池、锁、并发容器以及实例等内容。
Java多线程编程学习笔记
基本概念
线程和进程
线程是操作系统能够进行运算调度的最小单位,而进程是程序执行时的一个实例。在操作系统中,一个进程可以包含多个线程,在同一进程中的多个线程共享同一地址空间和资源。
并发和并行
并发是指两个或者多个任务可以在同一个时间段内被执行,而并行是指两个或者多个任务可以在同一时刻被执行。
线程状态
线程有五种状态,分别是创建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。
线程安全
什么是线程安全
线程安全是指在多线程环境下,程序依然能够正确地处理数据,且不会出现意料之外的结果。
线程安全的实现方式
线程安全可以通过同步机制来实现,包括使用synchronized关键字、Lock接口等方式。另外,也可以使用并发容器来保证线程安全,例如ConcurrentHashMap、ConcurrentLinkedQueue等。
线程池
什么是线程池
线程池是一种预先创建好的线程队列,在需要执行任务时,从线程池中取出一个线程进行执行,执行完毕后将该线程归还到线程池。这样可以避免不断地创建和销毁线程,提高程序的性能。
线程池的实现方式
Java中的线程池有两种实现方式,分别是ThreadPoolExecutor和ScheduledThreadPoolExecutor。
实例:使用线程池实现多线程下载文件
以下是一个使用线程池实现多线程下载文件的示例代码:
javaCopy Codeimport java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FileDownloader {
private static final int BUFFER_SIZE = 4096;
private String fileUrl;
private String saveDir;
public FileDownloader(String fileUrl, String saveDir) {
this.fileUrl = fileUrl;
this.saveDir = saveDir;
}
public void download() {
ExecutorService executorService = Executors.newFixedThreadPool(5);
try {
URL url = new URL(fileUrl);
InputStream inputStream = url.openStream();
String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
FileOutputStream outputStream = new FileOutputStream(saveDir + "/" + fileName);
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
executorService.execute(new DownloadTask(buffer, bytesRead, outputStream));
}
executorService.shutdown();
while (!executorService.isTerminated()) {}
inputStream.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private class DownloadTask implements Runnable {
private byte[] buffer;
private int bytesRead;
private FileOutputStream outputStream;
public DownloadTask(byte[] buffer, int bytesRead, FileOutputStream outputStream) {
this.buffer = buffer;
this.bytesRead = bytesRead;
this.outputStream = outputStream;
}
@Override
public void run() {
try {
outputStream.write(buffer, 0, bytesRead);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
锁
什么是锁
锁是一种同步机制,可以用来控制对共享资源的访问。在Java中,常用的锁包括synchronized关键字、ReentrantLock类、ReadWriteLock等。
实例:使用锁控制对计数器的访问
以下是一个使用锁控制对计数器的访问的示例代码:
javaCopy Codeimport java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Counter {
private int count = 0;
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public void decrement() {
lock.lock();
try {
count--;
} finally {
lock.unlock();
}
}
public int getCount() {
return count;
}
}
并发容器
什么是并发容器
并发容器是一类特殊的容器,可以在多线程环境下保证线程安全。
常用并发容器
Java中常用的并发容器包括ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList、ConcurrentLinkedQueue等。
实例:使用ConcurrentHashMap实现线程安全的HashMap
以下是一个使用ConcurrentHashMap实现线程安全的HashMap的示例代码:
javaCopy Codeimport java.util.concurrent.ConcurrentHashMap;
public class MyMap {
private ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
public void put(String key, Integer value) {
map.put(key, value);
}
public Integer get(String key) {
return map.get(key);
}
public Integer remove(String key) {
return map.remove(key);
}
public boolean containsKey(String key) {
return map.containsKey(key);
}
}
以上便是Java多线程编程学习笔记的内容,希望对你有所帮助。