目录
01 线程简介
多任务:看起来同时在做多件事,本质上大脑在同一时间只做了一件事。
多线程:一条路,车变多了,容易堵车。为了提高道路利用率,于是加了多个车道。

-
程序:指令和数据的有序集合
-
进程:执行程序的一次执行过程,是系统资源分配的单位
-
线程:一个进程包含若干个线程,线程是CPU调度和执行的单位
02 线程创建
2.1 继承Thread类
-
子类继承Thread类具备多线程能力
-
启动线程:子类对象.start()
-
不建议使用:存在OOP单继承局限性
//创建线程方式一:继承Thread类,重写run()方法,调用start()开启线程
public class ExtendThread extends Thread {
@Override
public void run() {
//run方法线程执行体
for (int i = 0; i < 200; i++) {
System.out.println("我在学习多线程----" + i);
}
}
public static void main(String[] args) {
//main线程
//创建线程对象
ExtendThread extendThread = new ExtendThread();
//调用start方法开启线程 线程不一定立即执行CPU安排调度
// 执行时会在main方法执行过程中交替执行start
//即 “我在学习多线程” 会在 “我在看代码” 中间交替输出
extendThread.start();
for (int i = 0; i < 1000; i++) {
System.out.println("我在看代码----" + i);
}
}
}
2.2 实现Runnable接口
-
实现接口Runnable具有多线程能力
-
启动线程:传入目标对象+Thread对象.start()
-
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
//创建线程方式二:实现runnable接口,重写run方法,执行线程需要丢入runnable接口的实现类,调用start方法
public class ImplementRunnable implements Runnable{
@Override
public void run() {
//run方法线程执行体
for (int i = 0; i < 200; i++) {
System.out.println("我在学习多线程----" + i);
}
}
public static void main(String[] args) {
//main线程
//创建Runnable接口的实现类对象
ImplementRunnable implementRunnable = new ImplementRunnable();
//创建线程对象,通过线程对象来开启线程代理
/*Thread thread = new Thread(implementRunnable);
thread.start();*/
//匿名类方式开启线程
new Thread(implementRunnable).start();
for (int i = 0; i < 1000; i++) {
System.out.println("我在看代码----" + i);
}
}
}
2.3 实现Callable接口
-
实现Callable接口,需要返回值类型
-
重写call方法,需要抛出异常
-
创建目标对象
-
创建执行服务:
ExecutorService ser = Executors.newFixedThreadPool(1);
-
提交执行:
Future<Boolean> r1 = ser.submit(c1); -
获取结果:
boolean result1 = r1.get(); -
关闭服务:
ser.shutdownNow();
下载网络图片案例
import java.util.concurrent.*;
//线程创建方式三:实现Callable接口
/*
* callable好处:
* 可以定义返回值
* 可以抛出异常
* */
public class ImplementCallable implements Callable<String> {
private String url;//网络图片地址
private String fileName;//保存的文件名
public ImplementCallable(String url, String fileName){
this.url = url;
this.fileName = fileName;
}
//下载图片线程的执行体
@Override
public String call(){
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url,fileName);
System.out.println("下载的文件名为:" + fileName);
return fileName + "下载成功!";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建目标对象
ImplementCallable c1 = new ImplementCallable("https://img1.baidu.com/it/u=1285686181,305516673&fm=26&fmt=auto","java1.png");
ImplementCallable c2 = new ImplementCallable("https://img2.baidu.com/it/u=4084129530,3438713827&fm=26&fmt=auto","java2.png");
ImplementCallable c3 = new ImplementCallable("https://img1.baidu.com/it/u=3948758877,1669875695&fm=26&fmt=auto","java3.png");
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);//参数是服务执行的线程数
//提交执行
Future<String> r1 = ser.submit(c1);
Future<String> r2 = ser.submit(c2);
Future<String> r3 = ser.submit(c3);
//获取结果
String result1 = r1.get();
String result2 = r2.get();
String result3 = r3.get();
//输出call方法返回值
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
//关闭服务
ser.shutdownNow();
}
}
//下载器
class WebDownloader {
//下载方法
public void downloader(String url, String fileName){
try {
FileUtils.copyURLToFile(new URL(url),new File(fileName));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloader方法出现异常");
}
}
}

2万+

被折叠的 条评论
为什么被折叠?



