Java多线程(创建线程的三种方式、线程与进程)

本文深入探讨了Java中进程与线程的概念,详细讲解了通过继承Thread类、实现Runnable接口和Callable接口创建线程的三种方式,并对比了它们的特点与适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java多线程

一、进程与线程
  • 程序:程序是指令和数据的有序集合,其本身没有任何运 行的含义,是一个静态的概念
  • 进程:进程是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位 。当一个程序进入内存运行时,就变成了一个进程
  • 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程
  • 三者关系:简而言之,一个程序运行后至少有一个进程,一个进程里可以包含多个线程,但至少包含一个线程
二、继承Thread类创建线程
  • 创建步骤:

    1. 自定义线程类继承Thread类
    2. 重写run()方法,编写线程执行体
    3. 创建线程对象,调用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接口创建线程
  • 创建步骤

    1. 定义Runnable接口实现类
    2. 重写run()方法,编写线程执行
    3. 创建线程对象,调用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接口创建线程
  • 创建步骤

    1. 实现Callable接口,需要返回值类型
    2. 重写call方法,需要抛出异常
    3. 创建目标对象
    4. 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
    5. 提交执行:Future result1 = ser.submit(t1);
    6. 获取结果:boolean r1 = result1.get()
    7. 关闭服务:ser.shutdownNow()
  • 特点

    1. call()方法可以有返回值
    2. 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类的方式创建多线程,不能再继承其他父类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值