首页 > 编程语言 >Java-三种线程的实现方式

Java-三种线程的实现方式

时间:2024-10-17 21:19:43浏览次数:3  
标签:Java thread Thread Callable 线程 new 三种 public

1. 继承Thread类

可以通过创建一个新的类继承Thread类,并重写其run方法来实现线程。

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程运行中:" + Thread.currentThread().getName());
        // 线程要执行的代码
    }
}

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

2. 实现Runnable接口

更常见的方式是实现Runnable接口,因为它允许类继承其他类的同时实现多线程。这遵循了面向对象编程的最佳实践,即组合优于继承。

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("线程运行中:" + Thread.currentThread().getName());
        // 线程要执行的代码
    }
}

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

3. 实现Callable接口

Callable接口与Runnable类似,但它可以返回值并抛出异常。要使用Callable,通常需要结合FutureTask使用。

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println("Callable线程运行中:" + Thread.currentThread().getName());
        // 线程要执行的代码,并返回结果
        return 123;
    }
}

public class CallableExample {
    public static void main(String[] args) throws Exception {
        MyCallable callable = new MyCallable();
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread thread = new Thread(futureTask);
        thread.start(); // 启动线程

        // 获取callable线程的执行结果
        Integer result = futureTask.get();
        System.out.println("Callable线程结果:" + result);
    }
}

在实际应用中,选择哪种方式来实现线程通常取决于具体需求。如果需要返回结果或抛出异常,那么Callable可能是更好的选择。如果不需要这些功能,Runnable通常是首选,因为它更简单,也更灵活。继承Thread类的方式现在较少使用,因为它限制了类的继承结构。

标签:Java,thread,Thread,Callable,线程,new,三种,public
From: https://blog.csdn.net/weixin_57091309/article/details/143009745

相关文章

  • 线程和进程解释和创建
    一、含义:进程:是系统进行资源分配和调用的独立单位,每一个进程都有它自己的内存空间和系统资源。举例:IDEA,阿里云盘,wegame,steam线程:是进程中的单个顺序控制流,是一条执行路径一个进程如果只有一条执行路径,则称为单线程程序。一个进程如果有多条执行路径,则称为多线程程序。......
  • Java-类与对象
    一、面向对象在了解类与对象前,我们需要先知道"面向对象"这个词的概念:在Java语言中,我们的主要思想就是"面向对象",而在之前我们所学习的C语言中大部分时候的思想是"面向过程"。那么什么是"面向对象",什么是"面向过程"呢?在之前我们学习C语言,想要实现一个操作时,里面可能会有很多......
  • java_day14_HashSet、TreeSet、增强for循环、Map、HashMap、TreeMap、可变参数
    一、HashSetSet:HashSet:底层数据结构是哈希表,查找速度快,且元素唯一HashSet中的add方法实际上调用的是HashMap中的put方法底层和元素的hashCode方法值有关我们发现,底层判断待插入的元素是否已经存在哈希表中的方式是:将待插入的元素的哈希值与已经存......
  • JAVA基础知识补漏
    变量类型1.类变量:static2.实例变量:需要new3.局部变量:必须初始化常量final一般用大写表示命名规范所有变量、方法、类名:见名知意类成员变量:首字母小写和驼峰原则:monthSalary局部变量:首字母小写和驼峰原则常量:大写字母和下划线:MAX_VALUE类名:首字母大写和驼峰原则......
  • Java中JDK8-17新特性的学习上
    JDK8-17新特性(第一部分)目录JDK8-17新特性(第一部分)Lambda表达式新的时间/日期API的使用optional类的使用接口增强Lambda表达式Lambda表达式是JDK1.8之后的一种语法,是一个匿名函数,是对匿名函数的简写形式,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行......
  • JavaScript从零学起 —— 数据类型(进阶篇2)
    说明:此文章用作个人学习记录,若有任何问题或建议欢迎大家在评论区讨论文章目录前言一、Boolean(布尔值)1.定义2.实现3.用法示例4.常见问题与解决方法二、Undefined(未定义)1.定义2.实现3.常见问题与解决方法三、Null(空值)1.定义2.实现3.用法示例4.常见问题与......
  • JavaScript网页设计案例
    1.引言在前端开发中,JavaScript无疑是一个非常重要的语言。它不仅可以用于表单验证、动态内容更新,还能实现复杂的交互效果和动画。通过JavaScript,网页变得更加生动和富有互动性。本文将通过一个具体的网页设计案例,详细讲解如何使用JavaScript进行网页开发,包括准备工作、基础理......
  • 归并排序(Java)
    思想:基本思想是使用递归将数组不断分成两半,直到分成的小组都只剩下一个元素为止,随后分别开始排序,将排序好的数组合并在一起。归并排序使用了分治(DivideandConquer)的思想。包括以下三个步骤:划分(Divide):将原问题分解成几个规模较小的相同问题。解决(Conquer):递归求解这些子问......
  • LeetCode:809.情感丰富的文字(双指针 Java)
    目录809.情感丰富的文字题目描述:实现代码与解析:双指针原理思路:809.情感丰富的文字题目描述:        有时候人们会用重复写一些字母来表示额外的感受,比如 "hello"->"heeellooo", "hi"->"hiii"。我们将相邻字母都相同的一串字符定义为相同字母组,例如:"h",......
  • C#线程6---并发集合
    简介:   编程需要对基本的数据结构和算法有所了解。程序员为并发情况选择最合适的数据结构,那就需要知道很多事情,例如算法运行时间、空间复杂度,以及大写0标记法等。在不同的广为人知的场景中,我们总知道哪种数据结构更高效。对于并行计算,我们需要使用适当的数据结构。这些数......