多线程---创建线程

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 {@Overridepublic 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 {@Overridepublic 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() {@Overridepublic 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;}@Overridepublic 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.hqwc.cn/news/474661.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口和抽象类的区别

不同点&#xff1a; 1、接口只能定义抽象方法不能实现方法&#xff0c;抽象类既可以定义抽象方法&#xff0c;也可以实现方法。 2、单继承&#xff0c;多实现。接口可以实现多个&#xff0c;只能继承一个抽象类。 3、接口强调的是功能&#xff0c;具有什么能力。抽象类强调的是…

怎样让MCU/SFU视频会议ovmedia 接入GB28281监控视频参会互动

在国内视频应用对GB监控接入是常规操作&#xff0c;很多系统需要接入监控视频交互处理。我们以ovmedia视频会议为例做一个接入互动。 GB28181协议在流媒体系统较为普及&#xff0c;我们以开源SRS系统对接监控端再接入会议&#xff08;也可以用商用GB流平台&#xff0c;操作基本…

idea突然出现错误: “找不到或无法加载主类 @C:\Users\happ“解决方案

在公司敲代码时&#xff0c;编译器突然出现了以下报错&#xff0c;之前一直能正常运行 可以使用以下方法解决 找到启动类相关配置 找到Shorten command line,选择如下配置即可 进行到这里项目就能正常运行了&#xff0c;仅以此贴记录问题解决方案

java小知识

1、/META-INF/MANIFEST.MF /META-INF/MANIFEST.MF决定了jar的主类 在maven打包时&#xff0c;会自动生成这个文件 2、String不可变怎么理解 在String类的内部&#xff0c;存储字符变量的是一个char数组 这个value由private final修饰&#xff0c;且不提供修改的方法&#…

vue打包优化,webpack的8大配置方案

vue-cli 生成的项目通常集成Webpack &#xff0c;在打包的时候&#xff0c;需要webpack来做一些事情。这里我们希望它可以压缩代码体积&#xff0c;提高运行效率。 文章目录 &#xff08;1&#xff09;代码压缩&#xff1a;&#xff08;2&#xff09;图片压缩&#xff1a;&…

【复现】某公司指挥调度管理平台 RCE漏洞_51

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设备、维护人员和工作任务等。用户可以通过该平台发送指令…

H5 个人引导页带赞助版源码

H5 个人引导页带赞助版源码 源码介绍&#xff1a;一款带有4个选项的H5自适应引导页&#xff0c;右侧有QQ和微信联系按钮。带有三个赞助按钮。 下载地址&#xff1a; https://www.changyouzuhao.cn/9883.html

VNCTF 2024 Web方向 WP

Checkin 题目描述&#xff1a;Welcome to VNCTF 2024~ long time no see. 开题&#xff0c;是前端小游戏 源码里面发现一个16进制编码字符串 解码后是flag CutePath 题目描述&#xff1a;源自一次现实渗透 开题 当前页面没啥好看的&#xff0c;先爆破密码登录试试。爆破无果…

Acwing二分和前缀和(二)

机器人跳跃问题 原题链接&#xff1a;https://www.acwing.com/activity/content/problem/content/1570/ 二分查找更新条件只有两种&#xff1a; Rmid;else Lmid1&#xff1a;mid(LR)/2Lmid;else R mid-1&#xff1a;mid(LR1)/2 这两种更新条件的结果是一样的。 #include<…

力扣经典题:环形链表的检测与返回

1.值得背的题 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fasthead;struct ListNode*slowhead;while(fast!NULL&&fast->…

学习数据结构和算法的第9天

题目讲解 移除元素 ​ 给你一个数组nums和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val的元素&#xff0c;并返回移除后数组的新长度。 ​ 不要使用额外的数组空间&#xff0c;你必须仅使用0(1)额外空间并 原地 修改输入数组。 ​ 元素的顺序可以改变。你不需要…

【Python】【Pycharm】Python Script头文件设置

1、步骤&#xff1a;File->settings->Editor->File and CodeTemplates->Python Script 2、复制粘贴以下代码&#xff0c;应用即可&#xff1a; #!/usr/bin/env python# -*- coding: utf-8 -*-# Time :${DATE} ${TIME}# Author : admin# Site :${SITE}# Fi…