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类的方式创建多线程,不能再继承其他父类