多线程
线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
(理解:应用软件中互相独立,可以同时运行的功能)
进程
进程是程序的基本执行实体。(理解:一个软件运行之后就是一个进程)
多线程
有了多线程,就可以让程序同时做多件事情,就是为了提高程序的运行效率
多线程的应用场景
- 软件中的耗时操作
- 拷贝、迁移大文件
- 加载大量的资源文件
并发
在同一时刻,有多个指令在单个CPU上交替执行
并行
在同一时刻,有多个指令在多个CPU上同时执行
多线程的实现方式
1.继承Thread类的方式进心实现
package xyz.dimeng.m01thread1;
public class MyThread extends Thread{
@Override
public void run() {
//线程要执行的代码
for (int i = 0; i < 100; i++) {
System.out.println(getName()+"多线程方法"+i);
}
}
}
package xyz.dimeng.m01thread1;
public class ThreadDemo {
/***
* @description 多线程的第一种启动方式:
* 1.自己定义一个类继承Thread
* 2.重写run方法
* 3.创建子类的对象,并启动线程
* @param args
* @return void
* @author 乔晓扑
* @date 2024/5/7 23:24
*/
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
执行结果:一会执行线程1,一会执行线程2
2.实现Runnable接口的方式进行实现
package xyz.dimeng.m02thread2;
public class ThreadDemo {
public static void main(String[] args) {
/***
* @description 多线程的第二种启动方式:
* 1.自己定义一个类实现Runnable接口
* 2.重写里面的run方法
* 3.创建自己的类的对象
* 4.创建一个Thread类的对象,并开启线程
* @param args
* @return void
* @author 乔晓扑
* @date 2024/5/7 23:38
*/
MyRun mr = new MyRun();
Thread t1 = new Thread(mr);
Thread t2 = new Thread(mr);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
package xyz.dimeng.m02thread2;
public class MyRun implements Runnable{
@Override
public void run() {
//线程要执行的代码
for (int i = 0; i < 100; i++) {
Thread t = Thread.currentThread();
System.out.println(t.getName()+"多线程方法"+i);
}
}
}
执行结果:一会执行线程1,一会执行线程2
3.利用Callable接口和Future接口方式实现
package xyz.dimeng.m03thread3;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThreadDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
/***
* @description 多线程的第三种实现方式:
* 特点:可以获取到多线程运行的结果
* 1.创建一个类MyCallable实现Callable接口
* 2.重写call(是有返回值的,表示多线程运行的结果)
* 3.创建MyCallable对象(表示多线程要执行的任务)
* 4.创建FutureTask的对象(作用管理多线程运行的结果)
* 5.创建Thread类的对象,并启动
* @param args
* @return void
* @author 乔晓扑
* @date 2024/5/7 23:49
*/
//创建MyCallable对象(表示多线程要执行的任务)
MyCallable mc = new MyCallable();
//创建FutureTask的对象(作用管理多线程运行的结果)
FutureTask<Integer> ft = new FutureTask<>(mc);
Thread t1 = new Thread(ft);
t1.start();
System.out.println(ft.get());
}
}
package xyz.dimeng.m03thread3;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
//求1~100的和
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
return sum;
}
}
第三种可以获取到结果
第二种和第三种扩展性强可以继承其他的类