多线程---创建线程

news2025/1/23 12:15:19

1.概述

多线程是指从软件或者硬件上实现多个线程并发执行的技术。线程是程序中独立运行的程序片段,每个线程都有独立的执行流程,可以在同一时间内执行不同的任务。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。

多线程是并行化的一种形式,或者是拆分工作以便同时进行处理。线程化的程序将工作拆分到多个软件线程,而不是将大量工作交给单个内核。这些线程由不同的CPU内核并行处理,以节省时间。多线程可以提高程序的并发性和效率,实现异步处理,提高程序的响应速度和用户体验。

2.Thread类常用方法

  1. start():启动当前线程,使其进入就绪状态,等待CPU调度执行。调用该方法将自动调用线程的run()方法。
  2. run():线程执行的具体操作就在这个方法中定义。通常,我们会通过继承Thread类或实现Runnable接口来重写这个方法。
  3. currentThread():这是一个静态方法,用于返回当前正在执行的线程对象。
  4. getName():获取当前线程的名字。
  5. setName(String name):设置当前线程的名字。注意,这个设置通常在调用start()方法之前进行。
  6. yield():使当前线程放弃CPU的执行权,让其他线程有机会执行。这并不意味着当前线程不再执行,而是让出CPU时间片,等待下一次调度。
  7. join():在线程A中调用线程B的join()方法,会导致线程A等待,直到线程B执行完毕。这可以用来实现线程之间的同步。
  8. sleep(long millis):让当前线程休眠指定的毫秒数。在这段时间内,线程不会执行任何操作,也不会被调度。
  9. isAlive():判断当前线程是否还在执行。如果线程已经结束,该方法将返回false。
  10. interrupt():中断当前线程。如果线程正在执行阻塞操作(如sleep、wait、join等),中断会使其收到一个InterruptedException异常。

3.创建多线程的三种方式

创建子线程图解:

1. 继承Thread类:

实现步骤:

1.继承Thread类并重写run方法

public class MyThread extends Thread {

    @Override
    public void run(){
         for(int i=0;i<10;i++){
             System.out.println("子线程"+i);
         }
    }
}

2.实例化Thread类

3.启动线程

public class CreateThread01 {
    public static void main(String[] args) {
        Thread Thread = new MyThread();//创建线程
        Thread.start();//启动线程线程

        for(int i=0;i<10;i++){

            System.out.println("主线程"+i);
        }
    }
}

2.实现Runnable接口:

实现Runnable接口的类作为任务类然后通过Thread类的实例来运行这个任务类。这种方式更推荐,因为它避免了单一继承的限制,更便于共享资源。

实现步骤:

1.实现Runnable接口,重写run方法

public class MyRunable implements Runnable {
    @Override
    public void run() {
        for(int i=0;i<10;i++){

            System.out.println("子线程"+i);
        }
    }
}

2.实例化Runable类

3.传入Runable类参数实例化Thread类

4.启动线程

public class CreateThread02 {
    public static void main(String[] args) {
       //写法一
       // Runnable runable = new MyRunable();//实例化Rubable的子类,创建任务对象
     
//        new Thread(runable).start();//创建线程,将任务对象交给线程对象处理并启动线程
        //写法二,接口的匿名类写法
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    System.out.println("子线程"+i);
                }
            }
        }).start();

        for(int i=0;i<10;i++){
            System.out.println("主线程"+i);
        }
    }
}

3.利用Callable接口:

Callable接口是类似于Runnable的接口,实现Callable接口的类和实现Runnable接口的类都是可以被其它线程执行的任务。通过实现Callable接口可以获取返回值,并可以抛出异常。

实现步骤:

1.实现Callable接口重写call方法并通过泛型指定返回值类型,这里的call类似run方法。

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
    private int n;
    MyCallable(int n){
        this.n=n;
    }
    @Override
    public String call() throws Exception {

        int sum=0;
        for(int k=0;k<n;k++){
            sum++;
        }
        return Thread.currentThread().getName()+"执行结果"+sum;
    }
}

2.实例化未来任务类FutureTask

3.实例化Thread类来运行未来任务类

4.启动线程

5.获取返回值

import jdk.nashorn.internal.codegen.CompilerConstants;

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

public class CreateThread03 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建Callable对象
        Callable<String> callable = new MyCallable(100);
        //创建未来任务对象
        FutureTask<String> f1=new FutureTask(callable);
        //封装任务对象并启动线程
        new Thread(f1,"子线程1").start();
        //获取线程执行结果
        System.out.println(f1.get());

        Callable<String> callable2 = new MyCallable(200);
        FutureTask<String> f2=new FutureTask(callable2);
        new Thread(f2,"子线程2").start();
        System.out.println(f2.get());
    }
}

执行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1454579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Swift 5.9 新 @Observable 对象在 SwiftUI 使用中的陷阱与解决

概览 在 Swift 5.9 中&#xff0c;苹果为我们带来了全新的可观察框架 Observation&#xff0c;它是观察者开发模式在 Swift 中的一个全新实现。 除了自身本领过硬以外&#xff0c;Observation 框架和 SwiftUI 搭配起来也能相得益彰&#xff0c;事倍功半。不过 Observable 对象…

SPSSAU【文本分析】|我的词库

我的词库 文本分析时&#xff0c;可能涉及到一些新词&#xff0c;比如‘内卷’&#xff0c;这个词很可能在词典中并未出现过&#xff0c;词库也不认识它。但研究者自己认识它&#xff0c;此时可将该词纳入到新词词库中&#xff0c;让系统统计词频等信息时也对该词进行统计。当…

【牛客面试必刷TOP101】Day23.BM27 按之字形顺序打印二叉树和BM30 二叉搜索树与双向链表

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

公众号答题活动怎么做_答题大闯关,赢取丰厚奖品

【智慧挑战】答题大闯关&#xff0c;赢取丰厚奖品&#xff0c;你准备好了吗&#xff1f; 在这个信息爆炸的时代&#xff0c;知识就是力量&#xff0c;智慧就是财富。你是否想展现自己的聪明才智&#xff0c;挑战自己的知识极限&#xff1f;今天&#xff0c;我们特别策划了一场…

git分布式版本控制工具基本操作

Windows操作 1.1 git基本操作 1.设置用户签名 git config user.name xx git config user.email xxb163.com2.初始化本地库 git init3.查看本地库状态 git status4.添加暂存区 git add 文件名称 git add *5.提交本地库 git commit -m "描述信息" 文件6.查看版本…

代码随想录算法训练营29期|day53 任务以及具体安排

第九章 动态规划part10 121. 买卖股票的最佳时机 // 解法1 class Solution {public int maxProfit(int[] prices) {if (prices null || prices.length 0) return 0;int length prices.length;// dp[i][0]代表第i天持有股票的最大收益// dp[i][1]代表第i天不持有股票的最大收…

【Linux网络】网络编程套接字(预备知识+UDP)

目录 预备知识 1. 理解源IP地址和目的IP地址 2. 理解源MAC地址和目的MAC地址 3. 认识端口号 4. 理解源端口号和目的端口号 5. 端口号&#xff08;port&#xff09; vs 进程pid 6. 认识TCP协议和认识UDP协议 7. 网络字节序 socket编程接口 1. socket 常见API 2. sock…

C++ STL详解:map

目录 一、map的使用 1.1map模板参数 1.2map的构造函数及迭代器 1.3map的容量与元素访问 1.4map中的增删查改 二、日常实操 一、map的使用 CSTL详解&#xff1a;set 通过对set的简单了解&#xff0c;我们可以知道&#xff0c;set就类似于二叉搜索树的key模型&#xff0c;…

黑马程序员-瑞吉外卖-day8

目录 菜品新增 菜品代码准备&#xff1a; 1.entity 2.mapper 3.service 4.sevice目录下的impl目录 5.controller 菜品口味代码准备&#xff1a; 1.entity 2.mapper 3.service 4.sevice目录下的impl目录 菜品新增 分析&#xff1a; 后台系统中可以管理菜品信息&…

医用软管用双轴测径仪 外径与椭圆度的双重检测!

摘要&#xff1a;软管的一大特点就是容易产生形变&#xff0c;接触式测量稍施压力可能导致测量不准&#xff0c;因此非接触式的高精高速测径仪被广泛的应用于生产中。 关键词&#xff1a;双轴测径仪,医用软管测径仪,软管测径仪,测径仪,软管外径测量仪 引言 非接触式的外径测量仪…

【监控】spring actuator源码速读

目录 1.前言 2.先搂一眼EndPoint 3.EndPoint如何被注入 4.EndPoint如何被暴露 4.1.如何通过http暴露 4.2.如何通过jmx暴露 5.EndPoint是怎么实现监控能力的 6.知道这些的意义是什么 1.前言 版本&#xff1a;spring-boot-starter-actuator 2.6.3 阅读源码一定要带着疑…

【Gitea】配置 Push To Create

引 在 Git 代码管理工具使用过程中&#xff0c;经常需要将一个文件夹作为仓库上传到一个未创建的代码仓库。如果 Git 服务端使用的是 Gitea&#xff0c;通常会推送失败。 PS D:\tmp\git-test> git remote add origin http://192.1.1.1:3000/root/git-test.git PS D:\tmp\g…

LabVIEW智能家居控制系统

LabVIEW智能家居控制系统 介绍了一个基于LabVIEW的智能家居控制系统的开发过程。该系统利用LabVIEW软件与硬件设备相结合&#xff0c;通过无线网络技术实现家居环境的实时监控与控制&#xff0c;提升居住舒适度和能源使用效率。 项目背景&#xff1a;随着科技的发展和生活水平…

OpenAI超级视频模型Sora技术报告解读,虚拟世界涌现了

昨天白天&#xff0c;「现实不存在了」开始全网刷屏。 「我们这么快就步入下一个时代了&#xff1f;Sora简直太炸裂了」。 「这就是电影制作的未来」&#xff01; 谷歌的Gemini Pro 1.5还没出几个小时的风头&#xff0c;天一亮&#xff0c;全世界的聚光灯就集中在了OpenAI的So…

milvus insert api的数据结构源码分析

insert api的数据结构 一个完整的insert例子: import numpy as np from pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )num_entities, dim 10, 3print("start connecting to Milvus") connections.connect("default&q…

基于51单片机的智能台灯的设计与实现

摘 要:针对青少年因坐姿不正确、灯光亮度不合适、用眼过度等原因易导致的近视问题,文中提出使用51单片机作为主控制单元,选用红外检测、光敏检测、蓝牙通信、蜂鸣器和模数转换等模块,设计了一款智能台灯。该智能台灯具有节能、预防近视等功能。经测试,该台灯具有保护视力的…

DS Wannabe之5-AM Project: DS 30day int prep day20

Q1. Do you have any idea about Event2Mind in NLP? Yes, it is based on NLP research paper to understand the common-sense inference from sentences. Event2Mind: Common-sense Inference on Events, Intents, and Reactions The study of “Commonsense Reasoning”…

openAI的视频技术Sora背后:奥特曼清单法

hello家人们...本人熟悉PS、Xd、Ai、Sketch、Figma、墨刀、即时设计、mastergo、Pixso等行业设计软件以及前端开发等技能&#xff0c;拥有10年的UI经验&#xff0c;我们可以通过关注评论私信交流以帮助到您解决UI工作中的烦恼&#xff01;谢谢 OpenAI的视频技术Sora背后&#x…

小型洗衣机哪个牌子质量好?小型洗衣机十大排名

清洗内衣内裤这些贴身衣物确实是一件比较头疼的事&#xff0c;有的小伙子由于工作的劳累通常在洗完澡后并不喜欢直接清洗内衣内裤&#xff0c;会存上几天再扔到洗衣机里&#xff0c;这样做是很不可取的&#xff0c;因为穿过的内裤很久不洗就会滋生细菌&#xff0c;另外&#xf…

Linux基础IO【文件系统】

目录 1.磁盘文件 2.磁盘概念 2.1基本结构 2.2数据存储 3磁盘信息 3.1块组信息 4.文件操作 4.1文件创建 4.2文件访问 4.3对文件增删查改 4.4大文件存储 总结&#xff1a; 1.磁盘文件 在计算机中&#xff0c;没有被打开的文件都是静静的躺在外存&#xff08;磁盘…