首页 > 其他分享 >线程的基本使用

线程的基本使用

时间:2024-07-04 13:54:07浏览次数:11  
标签:基本 Runnable Thread 接口 Callable 线程 使用 执行

线程

1.什么是线程

线程(Thread)是计算机科学中的基本概念,用于描述一个程序内部的执行路径。一个线程可以被看作是一个程序内部的独立执行流,能够单独执行代码,并与其他线程共享同一进程的资源。以下是关于线程的一些详细信息:

  1. 线程的特点
    • 轻量级:线程是比进程更小的执行单位。一个进程中可以包含多个线程,每个线程相对独立而且占用的资源较少。
    • 并发执行:多个线程可以并发执行,各自独立地执行自己的任务,可以实现多任务处理。
    • 共享内存:同一进程内的线程共享该进程的内存资源,因此可以直接访问共享变量,但也因此需要考虑线程安全性问题。
  2. 线程的创建
    • 在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。
    • 继承Thread类需要重写run()方法,然后创建Thread的实例并调用start()方法来启动线程。
    • 实现Runnable接口需要实现run()方法,然后创建Thread的实例并将实现了Runnable接口的对象作为参数传递给Thread的构造函数来启动线程。
  3. 线程的生命周期
    • 线程在执行过程中会经历不同的状态,如新建、就绪、运行、阻塞和终止等状态。
    • 线程的生命周期可以通过Thread类的方法来管理和控制,比如start()方法用于启动线程,sleep()和wait()方法用于使线程休眠或等待,join()方法用于等待一个线程执行完成。
  4. 线程调度
    • 线程调度是操作系统或虚拟机对多个线程之间的执行顺序进行管理和调度的过程。
    • 线程调度策略包括抢占式调度和协作式调度,在不同的操作系统和编程环境中可能有不同的调度策略。
  5. 线程同步与线程安全
    • 多个线程访问共享数据时会引发竞争条件和数据不一致的问题,因此需要通过同步机制来确保多线程安全访问共享资源。
    • Java提供了synchronized关键字、Lock对象、volatile关键字等机制来实现线程同步,以避免多线程并发访问导致的问题。

线程是并发编程中非常重要的概念,合理使用线程可以充分利用多核处理器的性能优势,提高程序的性能和响应速度。然而,需要注意线程间的协作、同步和安全性问题,以避免因为多线程访问共享资源而导致的意外结果。

2.创建线程的方式

在Java中,有两种主要的方式来创建线程:

1.通过继承Thread类:

  • 创建一个继承自Thread类的子类,重写子类的run()方法来定义线程要执行的任务。
  • 实例化子类的对象,并调用start()方法来启动线程的执行。
public class MyThread extends Thread {
    public void run() {
        // 定义线程要执行的任务
        System.out.println("Thread is running");
    }
}

// 启动线程
public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();
}

2.通过实现Runnable接口:

  • 创建一个实现了Runnable接口的类,实现接口中的run()方法来定义线程要执行的任务。
  • 创建Thread对象,将实现了Runnable接口的类的实例作为参数传递给Thread的构造函数,并调用start()方法来启动线程的执行。
public class MyRunnable implements Runnable {
    public void run() {
        // 定义线程要执行的任务
        System.out.println("Runnable is running");
    }
}

// 启动线程
public static void main(String[] args) {
    MyRunnable myRunnable = new MyRunnable();
    Thread thread = new Thread(myRunnable);
    thread.start();
}

这两种方式都可以用来创建线程,但一般推荐使用实现Runnable接口的方式,因为Java不支持多重继承,而实现接口可以更灵活地扩展其他类。另外,通过实现Runnable接口还能更好地描述任务和线程之间的关系,使代码更清晰和易于维护。

在Java中,除了通过继承Thread类或实现Runnable接口来创建线程外,还可以使用Callable接口来创建线程。Callable接口是一个泛型接口,可以返回线程执行结果,并且可以抛出异常。与Runnable接口不同的是,Callable接口的call()方法可以有返回值。

下面是使用Callable接口创建线程的步骤:

  1. 创建一个实现Callable接口的类,并实现call()方法来定义线程要执行的任务。
import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
    public String call() throws Exception {
        // 定义线程要执行的任务
        return "Callable is running";
    }
}

​ 2.使用Executor框架来启动Callable任务。Executor框架是Java并发编程中用来管理线程的工具,可以在程序中方便地提交和执行线程任务。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main {
    public static void main(String[] args) {
        MyCallable myCallable = new MyCallable();

        // 创建线程池
        ExecutorService executor = Executors.newFixedThreadPool(1);

        // 提交Callable任务并获取Future对象
        Future<String> future = executor.submit(myCallable);
        
        try {
            // 获取线程执行结果
            String result = future.get();
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        // 关闭线程池
        executor.shutdown();
    }
}

在上面的示例中,我们首先创建了一个实现Callable接口的类MyCallable,然后通过Executor框架创建了一个线程池并提交了Callable任务。最后通过Future对象获取线程的执行结果。

使用Callable接口创建线程可以更方便地获取线程的执行结果,并且可以更灵活地处理异常。相比于Runnable接口,Callable接口更适合一些需要返回结果的线程任务场景

3.Thread类中常用的方法

在Java中,Thread类提供了许多常用的方法来操作线程。以下是Thread类中常用的一些方法:

  1. start()
  • 通过调用start()方法来启动线程,使其进入就绪状态,等待CPU调度执行。
  1. run()
  • 在Thread类中,run()方法定义了线程的执行逻辑。
  1. sleep(long millis)
  • 让当前线程休眠指定的时间(以毫秒为单位)。
  1. join()
  • 等待调用join()方法的线程执行完成后,当前线程再继续执行。
  1. join(long millis)
  • 等待调用join()方法的线程执行完成,最多等待millis毫秒。
  1. interrupt()
  • 中断线程,将线程的中断标记设置为true。
  1. isInterrupted()
  • 判断线程是否被中断。
  1. getName()
  • 获取线程的名称。
  1. setName(String name)
  • 设置线程的名称。
  1. yield()
  • 让出CPU执行权,给其他线程执行机会。
  1. isAlive()
  • 判断线程是否还存活。
  1. setPriority(int priority)
  • 设置线程的优先级。
  1. getPriority()
  • 获取线程的优先级。
  1. wait()
  • 当前线程进入等待状态,直到另一个线程调用notify()或notifyAll()方法唤醒它。
  1. notify() / notifyAll()
  • 唤醒正在等待的线程。

这些是Thread类中的一些常用方法,可以帮助我们操作线程的状态和行为。根据具体的需求,我们可以选择合适的方法来控制线程的执行。

4.Runable和Callable的区别

在Java中,Runnable和Callable接口都可以用来创建多线程,但它们之间有一些区别:

  1. 返回值
  • Runnable接口中的run()方法没有返回值,而Callable接口中的call()方法可以返回一个结果。
  1. 异常处理
  • Runnable接口中的run()方法不能抛出已检查异常,但可以通过try-catch在方法内部处理异常;而Callable接口的call()方法可以抛出异常,需要通过捕获或声明抛出来处理异常。
  1. 返回结果
  • Callable接口可以返回一个结果,而Runnable接口无法直接返回结果,但可以通过共享变量或其他方式来获取线程执行结果。
  1. Future类
  • 在使用Callable接口时,可以通过Future来获取线程执行的结果,而Runnable接口没有提供类似的机制。
  1. 适用场景
  • Callable适用于需要返回结果、可能抛出异常的线程任务;而Runnable适用于简单的无需返回结果、不会抛出异常的线程任务。

总的来说,如果需要线程执行任务后返回一个结果或者抛出异常,可以使用Callable接口;如果只是简单的执行任务而不需要返回结果,可以使用Runnable接口。根据具体需求,选择适合的接口来创建线程可以使代码更加清晰和方便处理线程任务的结果

标签:基本,Runnable,Thread,接口,Callable,线程,使用,执行
From: https://www.cnblogs.com/lsran/p/18283717

相关文章

  • JAVA基础:包的概念和使用
    目录package关键字1,包的概念2,包的定义格式3,包的特点import关键字1,导包的意义2,导包的格式3,注意事项package关键字1,包的概念包其实就是一个一个的文件夹,这些文件夹里放着Java中各种各样的类。在开发中会出现多个开发人员共同开发同一个项目的情况,这时肯定就会出现类......
  • LaTeX 编辑协作平台 Overleaf 安装和使用教程
    在学术界和科技行业,LaTeX已成为撰写高质量文档的标准工具。然而,传统的LaTeX使用体验常常伴随着以下挑战:学习曲线陡峭环境配置复杂多人协作困难实时预览不便当然,市面上不乏很多在线LaTeX编辑平台,但它们大多是封闭的商业服务,无法完全满足用户对数据隐私和自主可控的需求......
  • 使用钉钉Oauth2授权登录Odoo配置
    准备工作需要用到的模块:Odoo/auth_oauthOCA/server-auth/auth_oidc因为钉钉的Oauth授权流程比较特殊,需要继承改造res.users上的几个方法models\res_users.pyclassResUsers(models.Model):_inherit="res.users"dingtalk_userid=fields.Char('DingtalkUser......
  • JAVA多线程快速入门
    什么是多线程概述线程线程是操作系统能够进行运算调度的最小单位它被包含在进程之中,是进程中的实际运作单位简单理解应用软件中互相独立,可以同时运行的功能进程进程是程序的基本执行实体/系统分配资源的基本单位作用充分利用cpu提......
  • 探案:其它配置|参数无错,罪魁祸首是它----使用lombok包Builder注解引起MyBatisSystemExce
    案件回顾:场景:实现某查询功能。详情具体如下:注意⚠️⚠️org.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.executor.result.ResultMapException:Errorattemptingtogetcolumn'xxx'fromresultset.Cause:java.lang.NumberFormatExcept......
  • 教你使用Icepak建立翅片式散热器模型
    本教程演示利用Icepak建立翅片式散热器模型。注:本系列案例来自Icepak官方tutorial。Icepak本质上只是一个前处理器,用于构建电子散热过程中的各类模型,其利用Fluent作为求解器。因此如果熟悉Fluent热计算的话,使用Icepak相对就比较容易了。案例包含的内容:新建工程利用b......
  • idea Webstorm Pycharm2024最新版 永久使用教程 附激活码亲测可用2099年
    IDEA2024的激活与安装(全网最靠谱,最快捷的方式)大家都在为使用IDEA需要收费而烦恼。IDEA,idea即IntelliJIDEA,是一款强大的集成开发环境,广泛应用于Java开发。但是IDEA是付费的,免费版功能有太少,怎么才能既免费,又能使用上正式版呢!当然还是激活啦(不是正版用不起,而是‘激活’更有性价......
  • Echarts中的折线图,多个Y轴集中在左侧(在Vue中使用多个Y轴的折线图)
    简述:在ECharts中,创建一个带有多个Y轴的折线图,并且将这些Y轴都集中显示在图表的左侧,可以通过合理配置yAxis和series的属性来实现。简单记录一.函数代码drawCarNumEcs(){//初始化echarts图表,并绑定到id为"cfog_four"的DOM元素上varmyChart=this.$ec......
  • 基于卷积神经网络的交通标志识别系统(通过TensorFlow构建LeNet-5模型,并使用GTSRB德国交
    完成程序下载点此下载1、资源项目源码均已通过严格测试验证,保证能够正常运行;2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业......
  • DEV中SpinEdit使用
    属性:      spinEdit1.BorderStyle=DevExpress.XtraEditors.Controls.BorderStyles.Office2003;//设置边框样式      spinEdit1.EnterMoveNextControl=true;//但用户按Enter键时是否将焦点移动到下一个控件      spinEdit1.ForeColor=......