多线程
线程介绍
-
任务
-
进程 (Process )
- 一个进程里可以有多个线程,如视频中同是听到声音,看图像,看弹幕,等等
-
线程 (Thread)
-
Process与Thread
-
Process:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念
-
Thread:线程则是执行程序的一次执行过程,他是一个动态的概念。是系统资源分配的单位
-
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位
-
-
多线程
线程实现(重点)
三种创建方式
- 继承Thread类(重点)
package chapter02.demo.demo01;
/**
* @program: Java-API
* @description: 创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
* @author: Jam
* @create: 2022-04-20 15:12
**/
public class TestThread1 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("在听狂神课-----");
}
}
//main线程,主线程
public static void main(String[] args) {
//创建线程对象
TestThread1 testThread1 = new TestThread1();
testThread1.start();
for (int i = 0; i < 1000; i++) {
System.out.println("在学多线程-----");
}
}
}
-
实现Runnable接口(重点)
package chapter02.demo.demo01; /** * @program: Java-API * @description: 创建线程方式二:实现Runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start() * @author: Jam * @create: 2022-04-20 23:12 **/ public class TestThread3 implements Runnable{ @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println("在听狂神课-----"); } } public static void main(String[] args) { //创建runnable接口实现类 TestThread3 testThread3 = new TestThread3(); //创建线程对象,通过线程对象来开启我们的线程,代理 new Thread(testThread3).start(); for (int i = 0; i < 1000; i++) { System.out.println("我在学习多线程"); } } }
小结
不建议使用:避免OOP单继承局限性
继 承 T h r e a d 类 − − 》 子 类 继 承 T h r e a d 类 具 备 多 线 程 能 力 − − 》 启 动 线 程 : 子 类 对 象 . s t a r t ( ) 继承Thread类--》 子类继承Thread类具备多线程能力--》 启动线程:子类对象.start() 继承Thread类−−》子类继承Thread类具备多线程能力−−》启动线程:子类对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
实 现 R u n n a b l e 接 口 − − 》 实 现 接 口 R u n n a b l e 具 有 多 线 程 的 能 力 − − 》 启 动 线 程 : 传 入 目 标 + T h r e a d ( 对 象 ) . s t a r t ( ) 实现Runnable接口--》实现接口Runnable 具有多线程的能力--》启动线程:传入目标+Thread(对象).start() 实现Runnable接口−−》实现接口Runnable具有多线程的能力−−》启动线程:传入目标+Thread(对象).start() -
实现Callable接口(了解)
package chapter02.demo.demo04;
import chapter02.demo.demo01.TestThread2;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
/**
* @program: Java-API
* @description: 线程创建方式三:实现Callable接口
* @author: Jam
* @create: 2022-04-22 14:25
**/
public class TestCallable implements Callable<Boolean> {
private String url;//网络图片地址
private String name;//保存的文件名
public TestCallable() {
}
public TestCallable(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public Boolean call() {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url,name);
System.out.println(" 下载了到文件名为"+name);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable testThread1 = new TestCallable("网上图片地址","1.jpg");
TestCallable testThread2 = new TestCallable("网上图片地址","2.jpg");
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(2);
//提交执行
Future<Boolean> submit1 = ser.submit(testThread1);
Future<Boolean> submit2 = ser.submit(testThread2);
//获取结果
Boolean aBoolean1 = submit1.get();
Boolean aBoolean2 = submit1.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方法出现问题");
}
}
}
龟兔赛跑案例
package chapter02.demo.demo03;
/**
* @program: Java-API
* @description: 多线程龟兔赛跑案例
* @author: Jam
* @create: 2022-04-21 23:21
**/
@SuppressWarnings("all")
public class Race implements Runnable {
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 1000; i++) {
//模拟兔子睡觉
if (Thread.currentThread().getName().equals("兔子")){
try {
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断是否出现胜利者
if (gameOver(i)) {
break;
}
System