Java基础之线程的创建方式

本文介绍了Java中创建线程的四种常见方式:继承Thread类、实现Runnable接口、实现Callable接口,以及线程池的使用示例。重点讲解了每种方式的优缺点及代码实现。

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

Java基础之线程的创建方式

在编程过程中,我们会遇到很多高并发问题,而这恰恰就是多线程所导致的,下面就线程的创建方式简单的介绍一下,后期在并发编程和线程池再做详细介绍。

方式1:继承Thread类

缺点: Java语言是单继承,这就意味着不能继承其他的类了;而且每创建一个对象只能对应一个线程。
优点: 创建即可用,一个对象仅对应唯一一个线程。

方式2:实现Runnable接口

缺点: 仅创建实现类对象,并没有对应的线程,需要重写run方法。
优点: 在用的时候才创建线程;一个对象可以对应多个线程;避免的单继承现象。

方式3:实现Callable接口

缺点: 创建实现类对象,并没有对应的线程,需要重写call方法。
优点: 同Runnable一样,但Callable也可以接收返回值以及声明异常。

方式4:线程池

线程复用、管理线程、控制最大并发量。

代码示例

注:

  • Thread(Runnable target):利用Runable对象创建一个线程,启动时将执行该对象的run方法
  • Thread(Runnable target,String name) : 利用Runnable对象创建一个线程,并指定该线程的名称。
  • Thread.currentThread():是获得当前线程的方法。

方式1:继承Thread类

/**
 * 创建线程方式1 extends Thread
 * @author wenhua
 * @date 2022年04月15日 11:23
 */
public class ExtendThread extends Thread{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"继承Thread类创建线程");
    }
}

方式2:实现Runnable接口

package com.wenhua.project;
/**
 * 线程创建方式2(推荐):implements Runnable
 * 		(1.java是单继承,多实现;避免了单继承的局限性。)
 * 		(2.多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源)
 * @author wenhua
 * @date 2022年04月15日 13:22
 */
public class ImplemnetRunnable implements Runnable{
    @Override
    public void run() {
    	System.out.println(Thread.currentThread().getName()+"实现Runnable创建线程");
    }
}

方式3:实现Callable接口

import java.util.concurrent.Callable;

/**
 * 线程创建方式3:implements Callable 
 * @author wenhua
 * @date 2022年04月16日 10:09
 */
public class ImplementCallable implements Callable {

    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName()+"正在调用的是Call方法");
        return 5;
    }
}

测试类

import java.util.concurrent.*;

/**
 * @author wenhua
 * @date 2022年04月14日 11:14
 */
public class ThreadTest {
    public static void main(String[] args) {

        // 方式1 : 继承Thread类来创建线程
        ExtendThread Thread1 = new ExtendThread();// 创建线程对象
        // Thread1.run(); 简单的方法调用,不是启动线程
        Thread1.start(); // start方法启动该线程

        // 方式2 : 实现Runnable接口创建线程
        ImplemnetRunnable Thread2 = new ImplemnetRunnable();// 创建实现接口类的实例对象
        Thread thread2 = new Thread(Thread2);// 创建线程对象
        thread2.start();// 启动线程

        // 方式3 :实现Callable接口创建线程:可以有返回值,以及声明抛出异常
        ImplementCallable Thread3 = new ImplementCallable();// 创建实现接口类的实例对象
        // 使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值
        FutureTask<Integer> future = new FutureTask<Integer>(Thread3);
        Thread thread3 = new Thread(future);// 创建线程对象
        thread3.start();// 启动线程
        // 处理异常
        try{
            System.out.println("call返回值:"+future.get());// 返回Callable里call()方法的返回值,接收并打印返回值
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        // 方式4 : 通过线程池创建线程
        // 4.1创建一个可缓存的线程池;即根据任务自动新增或回收线程
        ExecutorService executorService = Executors.newCachedThreadPool();
        // 4.2创建固定大小的线程池;根据提交的任务逐个增加线程,知道最大值保持不变。
        // ExecutorService executorService = Executors.newFixedThreadPool(3);
        // 4.3支持定时以及周期性执行任务的需求。
        // ExecutorService executorService = Executors.newScheduledThreadPool(6);
        // 4.4一个单线程的线程池。
        // ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++){
            executorService.execute(new ImplemnetRunnable());
        }
        executorService.shutdown();
    }
}

后期我们还会详细了解线程池。谢谢您的阅览,如有错误欢迎批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值