Java多线程
一、进程与线程
- 程序:程序是指令和数据的有序集合,其本身没有任何运 行的含义,是一个静态的概念
- 进程:进程是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位 。当一个程序进入内存运行时,就变成了一个进程
- 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程
- 三者关系:简而言之,一个程序运行后至少有一个进程,一个进程里可以包含多个线程,但至少包含一个线程
二、继承Thread类创建线程
- 创建步骤:
- 自定义线程类继承Thread类
- 重写run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
- 案例
public class TestThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+ i);
}
}
public static void main(String[] args) {
new TestThread().start();
new TestThread().start();
}
}
运行结果:
三、实现Runnable接口创建线程
- 创建步骤
- 定义Runnable接口实现类
- 重写run()方法,编写线程执行
- 创建线程对象,调用start()方法启动线程
- 案例
public class TestRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+ i);
}
}
public static void main(String[] args) {
TestRunnable runnable = new TestRunnable();
new Thread(runnable).start();
new Thread(runnable).start();
}
}
运行结果:
四、实现Callable接口创建线程
- 创建步骤
- 实现Callable接口,需要返回值类型
- 重写call方法,需要抛出异常
- 创建目标对象
- 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
- 提交执行:Future result1 = ser.submit(t1);
- 获取结果:boolean r1 = result1.get()
- 关闭服务:ser.shutdownNow()
- 特点
- call()方法可以有返回值
- call()方法可以声明抛出异常
- 案例
import java.util.concurrent.*;
public class TestCallable implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+ i);
}
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable testCallable = new TestCallable();
//创建执行服务
ExecutorService service = Executors.newFixedThreadPool(2);
//提交执行
Future<Boolean> submit = service.submit(testCallable);
Future<Boolean> submit1 = service.submit(testCallable);
//获取结果
Boolean aBoolean = submit.get();
Boolean aBoolean1 = submit1.get();
//判断线程是否顺利结束或者有异常
System.out.println(aBoolean);
System.out.println(aBoolean1);
//关闭服务
service.shutdownNow();
}
}
运行结果:
五、创建线程的三种方式对比
- 采用实现Runnable,Callable接口的方式创建多线程,还可以继承其他类,多个线程可以继承共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况
- 采用继承Thread类的方式创建多线程,不能再继承其他父类