首页 > 其他分享 >线程创建的几种方式,你都知道吗?

线程创建的几种方式,你都知道吗?

时间:2024-10-20 17:47:43浏览次数:3  
标签:Thread 创建 System 兔子 几种 线程 println 乌龟 out

使用继承 Thread 类的方法来创建线程,分别表示兔子和乌龟的比赛。

class Turtle extends Thread {
    @Override
    public void run() {
        System.out.println("乌龟开始赛跑!");
        for (int i = 1; i <= 10; i++) {
            System.out.println("乌龟跑了 " + i + " 米。");
            try {
                Thread.sleep(1000); // 乌龟慢慢跑
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("乌龟到达终点,乌龟获胜!");
    }
}

class Rabbit extends Thread {
    @Override
    public void run() {
        System.out.println("兔子开始赛跑!");
        for (int i = 1; i <= 10; i++) {
            System.out.println("兔子跑了 " + i + " 米。");
            if (i % 3 == 0) {
                System.out.println("兔子停下来休息一下。");
                try {
                    Thread.sleep(2000); // 兔子休息
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("兔子到达终点,兔子获胜!");
    }
}

public class RaceExample {
    public static void main(String[] args) {
        Turtle turtle = new Turtle();
        Rabbit rabbit = new Rabbit();
        
        turtle.start(); // 启动乌龟线程
        rabbit.start(); // 启动兔子线程
    }
}

结果
在这里插入图片描述
2. 实现 Runnable 接口
实现 Runnable 接口的方式,分别表示兔子和乌龟的比赛

class TurtleRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("乌龟开始赛跑!");
        for (int i = 1; i <= 10; i++) {
            System.out.println("乌龟跑了 " + i + " 米。");
            try {
                Thread.sleep(1000); // 乌龟慢慢跑
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("乌龟到达终点,乌龟获胜!");
    }
}

class RabbitRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("兔子开始赛跑!");
        for (int i = 1; i <= 10; i++) {
            System.out.println("兔子跑了 " + i + " 米。");
            if (i % 3 == 0) {
                System.out.println("兔子停下来休息一下。");
                try {
                    Thread.sleep(2000); // 兔子休息
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("兔子到达终点,兔子获胜!");
    }
}

public class RaceRunnableExample {
    public static void main(String[] args) {
        Thread turtleThread = new Thread(new TurtleRunnable());
        Thread rabbitThread = new Thread(new RabbitRunnable());
        
        turtleThread.start(); // 启动乌龟线程
        rabbitThread.start(); // 启动兔子线程
    }
}

运行结果
在这里插入图片描述
3. 使用 Callable 和 Future
使用 Callable 和 Future 来实现龟兔赛跑的例子

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

class TurtleCallable implements Callable<String> {
    @Override
    public String call() {
        StringBuilder result = new StringBuilder("乌龟开始赛跑!\n");
        for (int i = 1; i <= 10; i++) {
            result.append("乌龟跑了 ").append(i).append(" 米。\n");
            try {
                Thread.sleep(1000); // 乌龟慢慢跑
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        result.append("乌龟到达终点,乌龟获胜!");
        return result.toString();
    }
}

class RabbitCallable implements Callable<String> {
    @Override
    public String call() {
        StringBuilder result = new StringBuilder("兔子开始赛跑!\n");
        for (int i = 1; i <= 10; i++) {
            result.append("兔子跑了 ").append(i).append(" 米。\n");
            if (i % 3 == 0) {
                result.append("兔子停下来休息一下。\n");
                try {
                    Thread.sleep(2000); // 兔子休息
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        result.append("兔子到达终点,兔子获胜!");
        return result.toString();
    }
}

public class RaceCallableExample {
    public static void main(String[] args) {
        FutureTask<String> turtleTask = new FutureTask<>(new TurtleCallable());
        FutureTask<String> rabbitTask = new FutureTask<>(new RabbitCallable());
        
        Thread turtleThread = new Thread(turtleTask);
        Thread rabbitThread = new Thread(rabbitTask);
        
        turtleThread.start(); // 启动乌龟线程
        rabbitThread.start(); // 启动兔子线程
        
        try {
            System.out.println(turtleTask.get()); // 打印乌龟的结果
            System.out.println(rabbitTask.get()); // 打印兔子的结果
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}
  1. 使用线程池(Executor 框架)
    使用 Executor 框架来管理线程的龟兔赛跑例子。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class RaceExecutorExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2); // 创建一个固定大小的线程池

        executor.submit(() -> {
            System.out.println("乌龟开始赛跑!");
            for (int i = 1; i <= 10; i++) {
                System.out.println("乌龟跑了 " + i + " 米。");
                try {
                    Thread.sleep(1000); // 乌龟慢慢跑
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("乌龟到达终点,乌龟获胜!");
        });

        executor.submit(() -> {
            System.out.println("兔子开始赛跑!");
            for (int i = 1; i <= 10; i++) {
                System.out.println("兔子跑了 " + i + " 米。");
                if (i % 3 == 0) {
                    System.out.println("兔子停下来休息一下。");
                    try {
                        Thread.sleep(2000); // 兔子休息
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            System.out.println("兔子到达终点,兔子获胜!");
        });

        executor.shutdown(); // 关闭线程池
    }
}

1.继承 Thread 类: 简单易用,适合不需要共享状态的简单任务。每个线程都代表一个独立的类。

2.实现 Runnable 接口: 可以实现更灵活的线程管理,可以共享同一个任务实例。适合需要多个线程共享资源的情况。

3.使用 Callable 和 Future: 允许线程返回结果和处理异常,适合需要获取计算结果的场景。

4.使用线程池: 适合需要管理大量线程的场景,通过复用线程降低开销。

标签:Thread,创建,System,兔子,几种,线程,println,乌龟,out
From: https://blog.csdn.net/qq_46091953/article/details/143095640

相关文章

  • Java中的进程与线程(如果想知道Java中有关进程与线程的知识点,那么只看这一篇就足够了!)
        前言:在现代计算机系统中,进程和线程是实现并发和高效任务管理的核心概念。理解这两者的区别和联系,不仅对软件开发者至关重要,还能帮助用户更好地理解计算机的工作原理。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN......
  • pbootcms设置的会话目录创建失败!runtime/session/无法写入的解决方案
    当用户在安装PBootCMS模板时遇到报错信息:“pbootcms设置的会话目录创建失败!网站目录/runtime/session/无法接入”,可以尝试以下两种解决方案:解决方案一:检查网站目录权限登录服务器:通过SSH登录到你的服务器。更改目录权限:使用 chmod 命令更改 runtime/ 目录及其子目......
  • JavaScript事件循环:一杯咖啡的时间,搞懂主线程都经历了什么?
    我们今天来聊聊JavaScript事件循环。虽然这个词听起来很高深,但你可以把它想象成一个奶茶店里排队买奶茶的过程。主线程就像奶茶店的唯一一个店员,任务就是那些排队的订单,而JavaScript的事件循环就是这个店员处理订单的工作方式。先看代码,咱们慢慢聊:console.log('1:进店......
  • SolidWorks一键重命名、使之独立、创建新版
    在老铁们的大力支持之下,第5版终于面世了。本宏程序基于solidworks2021版设计,未在其余版本的solidworks下测试。本程序文件共享在网盘中,关注微信公众号“全栈开发的码农”并回复消息“一键重命名”即可获得下载链接和提取码。下载程序文件后,在solidworks打开任意文档,添加并运行宏。......
  • Halcon 创建变异模型
    *create_variation_model(::Width,Height,Type,Mode:ModelID)说明:创建一个ID为ModelID,宽为Width,高为Height,类型为Type的VariationModel,参数Mode决定了创建标准图像和相应的variation图像的方法。'standard'表示标准的训练方法,标准图像的位置是各训练图像位置的平均......
  • DJ混音创作 DJ Mix Pads 2 激活版 虚拟乐器和音效创建混音软件
    DJMixPads2是一款功能强大的音乐制作软件,它允许用户通过虚拟乐器和音效创建自己的音乐混音和曲目。该软件具有用户友好的界面,提供多种预加载样本和循环,支持电子、流行、摇滚等多种音乐风格。用户可以通过点击不同的打击垫和循环来实时创作音乐,并添加混响、延迟等效果。此外,DJ......
  • STA模型、同步上下文和多线程、异步调度
    写过任何桌面应用,尤其是WinForm的朋友们应该见过,Main函数上放置了一个[STAThread]的Attribute。而且几乎所有的桌面应用框架,都是由同一个UI线程来执行渲染操作的,这表现为从其他线程修改控件的值就会抛异常:awaitTask.Run(()=>control.Content="");//throwsexception大家......
  • Vue CLI 与 Vite:构建工具的选择及其在 Vue 项目中的应用(如何在 Vue 2 中使用 Vue CLI
    文章目录1.引言2.VueCLI与Vite的基本概念2.1VueCLI概述2.2Vite概述3.如何在Vue2中使用VueCLI进行项目创建3.1安装VueCLI3.2创建Vue2项目3.3启动开发服务器4.Vue3项目中如何使用Vite实现快速开发4.1使用Vite初始化Vue3项目4.2启......
  • 茴香豆的茴有四种写法,那二分有几种写法?
    《编程珠玑》一书的作者JonBentley曾经说过:“90%的程序员无法正确实现二分查找算法...”,今天,本文将带领你会写二分。经典写法现在我们来求解这样一个通用的二分查找问题:有一个不下降序列$a$,我们要从其中所有找到大于等于$k$的数的最小的下标。boolcheck(intindex)......
  • 6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss
    对话框对话框(Dialog)是一种常用的UI组件,它主要用于显示信息、接收用户操作反馈对话框可以包含各种元素,但是主要还是以文本、按钮为主,其次是列表其中,基础对话框是Android中最简单的对话框,而后是进度对话框、自定义对话框等一、UI线程问题1、UI线程中创建对话......