多线程
1.什么是多线程?
原来是一条路,慢慢因为车太多了,道路堵塞,效率极低。
为了提高使用的频率,能够充分利用道路,于是加了多个车道。
2.线程实现三种方式
-
继承Thread类
-
实现Runnable 接口
-
实现Callable 接口
继承Thread类实现多线程步骤如下
-
自定义线程类继承Thread类
-
重写run() 方法,编写线程执行体
-
创建线程对象,调用start() 方法启动线程
创建线程方式1:继承Thread(通过查看源码发现Thread 是实现Runnable接口的
public class TestThread1 extends Thread {
@Override
public void run() {
//run方法 线程体
for (int i = 0; i < 10; i++) {
System.out.println("我在撸代码--"+i);
}
}
public static void main(String[] args) {
//创建线程对象
TestThread1 testThread1 = new TestThread1();
//调用start()方法 ,开启线程
testThread1.start();
//main线程,主线程
for (int i = 0; i < 10; i++) {
System.out.println("我在学习--"+i);
}
}
}
//执行结果
我在学习--0
我在学习--1
我在学习--2
我在学习--3
我在学习--4
我在学习--5
我在学习--6
我在学习--7
我在撸代码--0
我在撸代码--1
我在学习--8
我在撸代码--2
我在撸代码--3
我在撸代码--4
我在学习--9
我在撸代码--5
我在撸代码--6
我在撸代码--7
我在撸代码--8
我在撸代码--9
创建线程方式2:实现Runnable接
public class TestThread3 implements Runnable{
@Override
public void run() {
//run方法 线程体
for (int i = 0; i < 10; i++) {
System.out.println("我在撸代码--"+i);
}
}
public static void main(String[] args) {
//创建线程对象
TestThread3 testThread3 = new TestThread3();
//创建线程对象,通过线程对象来开启我们的线程
Thread thread = new Thread(testThread3);
thread.start();
//main线程,主线程
for (int i = 0; i < 10; i++) {
System.out.println("我在学习--"+i);
}
}
}
//输出
我在学习--0
我在学习--1
我在学习--2
我在学习--3
我在学习--4
我在撸代码--0
我在学习--5
我在撸代码--1
我在学习--6
我在撸代码--2
我在撸代码--3
我在学习--7
我在学习--8
我在学习--9
我在撸代码--4
我在撸代码--5
我在撸代码--6
我在撸代码--7
我在撸代码--8
我在撸代码--9
1.实现Callable接口,需要返回值类型
2.重写call 方法,需要抛出异常
3.创建目标对象
4.创建执行服务:
5.提交执行:
6.获取结果:
7.关闭服务:
这边我们需要导入个包commons-io-2.6.jar,在com目录下创建lib目录,把上面jar包复制粘贴到里面,右键ADD as Libray
//线程创建方式三
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
public class Demo1 implements Callable<Boolean> {
private String url;//网络图片地址
private String name;//保存的文件名
public Demo1(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public Boolean call() throws Exception {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downLoader(url,name);
System.out.println("下载了文件名为:"+name);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
Demo1 t1 = new Demo1("https://fanyi-cdn.cdn.bcebos.com/static/translation/widget/footer/Products/img/product-desktop@2x_119666c.png","1.jpg");
Demo1 t2 = new Demo1("https://fanyi-cdn.cdn.bcebos.com/static/translation/widget/footer/Products/img/product-helper@2x_aa2eddc.png","2.jpg");
//创建执行服务 线程池
ExecutorService ser=Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
//获取结果
Boolean rs1 = r1.get();
Boolean rs2 = r2.get();
//关闭服务
ser.shutdown();
}
}
//下载器
class WebDownloader {
public void downLoader(String url, String name) {
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO 异常,Downloader方法出现问题");
}
}
}
总结:
继承Thread类
1.子类继承Thread 类具有多线程能力
2.启动线程:子类对象.start()
3.不建议使用:避免OOP单继承局限性
实现Runnable 接口
1.实现接口Runnable 具有多线程能力
2.启动线程:传入目标对象+Thread对象.start()
3.推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
该笔记,看狂神java视频学习

浙公网安备 33010602011771号