线程池—多线程总结—IO之概述

在这里插入图片描述
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
public class HasThreadPool {
static class 送快递任务 implements Runnable {
String 快递;
public 送快递任务(String 快递) {
this.快递 = 快递;
}
@Override
public void run() {
System.out.println("开始送快递: " + 快递);
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("快递送完了: " + 快递);
}
}
public static void main(String[] args) {
// 开了一家公司,有 10 个员工
ExecutorService 公司 = Executors.newFixedThreadPool(10);
// 主线程就是前台
Scanner scanner = new Scanner(System.in);
while (true) {
String 快递 = scanner.nextLine();
送快递任务 task = new 送快递任务(快递);
公司.execute(task);
}
}
}
在这里插入图片描述
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorDemo {
public static void main(String[] args) {
// 创建了一个
// 最多有 10 个正式员工
// 最多有 20 个员工包括正式和临时
// 临时工空闲时间最多有 60 SECONDS
// 传递任务的队列是一个 ArrayBlockingQueue(容量是 30)
// 执行默认的拒绝策略:处理不过来之后抛出异常
ExecutorService p1 = new ThreadPoolExecutor(
10,
20,
60,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(30)
);
// ExecutorService 引用可以指向一个线程池对象
// 怎么提交任务
p1.execute(new Runnable() {
@Override
public void run() {
}
});
p1.submit(new Runnable() {
@Override
public void run() {
}
});
// 怎么关闭线程池
p1.shutdown(); // 推荐使用上面的
p1.shutdownNow();
}
}
在这里插入图片描述
自己实现一个线程池:
import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class CustomThreadPool {
static class Worker extends Thread {
private BlockingQueue workQueue;
Worker(BlockingQueue workQueue) {
this.workQueue = workQueue;
}
@Override
public void run() {
// 员工要的事情
// 不停的
//while (true) {
while (!Thread.interrupted()) {
Runnable task = null;
try {
// 从队列中取任务,当队列为空时,线程就会阻塞,否则就一直工作
task = workQueue.take();
} catch (InterruptedException e) {
//e.printStackTrace();
// 这里表示收到了 interrupt 通知
break; // 退出
}
// 完成任务
task.run();
}
}
}
// 1. 传递任务用的阻塞队列
BlockingQueue workQueue = new LinkedBlockingQueue<>();
// 2. 基础所有的线程对象
// 公司里管理员工用的员工表
List workerList = new ArrayList<>();
CustomThreadPool(int nThreads) {
// 1. 创建阻塞队列,done
// 2. 创建所有的工作线程
for (int i = 0; i < nThreads; i++) {
Worker worker = new Worker(workQueue);
worker.start();
workerList.add(worker);
}
}
// 前台要做的就是把接到的任务放到队列中即可
// 工作线程会在合适的时候过来取任务的
void execute(Runnable task) throws InterruptedException {
workQueue.put(task);
}
void shutdown() {
// 让所有的线程都停止工作
// 可以使用 interrupt 建议一个线程停下来
// 实际上 Worker 什么时候停,你处理不了
for (Worker worker : workerList) {
worker.interrupt();
}
}
}
在这里插入图片描述
一个点 . 是表示当前节点
两个点…是表示当前节点的父节点
反斜杠\是Windows上用来切割节点名称的分割符
斜杠/是Linux上用来切割节点名单的分割符
Java中使用斜杠或者反斜杠都可以

OS管理文件
JVM如何描述文件——类+对象
File找个类,就是Java中用来描述一个文件的类
File的一个对象,就表示一个文件(文件可能不存在)

路径(path)分为
1.绝对路径:从文件系统的根节点描述的路径
2.相对路径:从“我”当前所在节点开始描述的路径
不管是绝对路径还是相对路径——作用都是在文件系统这个树中,定位一个文件(结点)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值