1、进程、线程、多线程概念
进程,每一个应用程序(类/模板)的实例是一个进程,每一个进程都是由多条线程构成的(可以让多个任务并行,效率高),如果只要一条线程,所有的任务只能按顺序执行(效率低)。线程是操作系统能够进行运算调度的最小单位,它比进程更小,是进程中的一个实体。多个线程可以在同一个进程中并发执行,共享进程的资源(如内存地址空间、文件描述符等),但每个线程拥有独立的栈空间和程序计数器。
2、线程的特点
(1)线程是CPU调度执行最基本的单位。(2)CPU再所有线程之间的切换是随机的(对java是随机,即使能设置优先级)。(3)默认情况下,线程与线程之间的执行是互不影响(除非手动干预,比如线程同步技术)。
3、创建线程的方式
3.1 继承Thread类
(1)创建一个类继承Thread类。(2)重写run()方法,将线程要执行的代码放在run()方法中。
(3)创建该类的实例,并调用start()方法启动线程。
public class Thread01 extends Thread{
private int num;
public Thread01(int num) {
this.num = num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public void run() {
System.out.println("继承Thread线程正在运行,正在运行:"+num);
}
}
3.2 实现Runnable接口
(1)创建一个类实现Runnable接口。(2)实现run()方法,将线程要执行的代码放在run()方法中。(3)创建Thread类的实例,并将实现了Runnable接口的类的实例作为参数传递给Thread类的构造函数。(4)调用Thread类的start()方法启动线程。
public class Thread02 implements Runnable{
@Override
public void run() {
System.out.println("实现Runnable线程正在运行");
}
}
3.3 实现Callable接口
(1)创建一个类实现Callable接口。(2)重写call方法。(3)创建目标对象(4)创建执行服务(5)提交执行(6)获取结果 (7)关闭服务
import java.util.concurrent.Callable;
public class Thread03 implements Callable<Integer> {
private int num;
public Thread03(int num) {
this.num = num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public Integer call() throws Exception {
System.out.println(num);
return 1;
}
}
import java.util.concurrent.*;
public class Client {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//(1) 继承 Thread
Thread01 thread01 = new Thread01(1);
Thread01 thread011 = new Thread01(2);
thread01.start();
thread011.start();
//(2)实现 Runnable
Thread02 thread02 = new Thread02();
Thread thread = new Thread(thread02);
thread.start();
//(3) 实现Callable
//创建执行服务
ExecutorService executorService = Executors.newFixedThreadPool(1);
Thread03 thread03 = new Thread03(1);
Thread03 thread031 = new Thread03(2);
Thread03 thread032 = new Thread03(3);
//提交执行
Future<Integer> submit = executorService.submit(thread03);
Future<Integer> submit1 = executorService.submit(thread031);
Future<Integer> submit2 = executorService.submit(thread032);
//获取结果
Integer integer1 = submit1.get();
Integer integer2 = submit1.get();
Integer integer3 = submit1.get();
//关闭服务
executorService.shutdown();
}
}