当前位置: 首页 > 编程日记 > 正文

Java多线程复习:2(线程的创建和使用)

线程的创建和使用

方法一,直接使用Thread

import lombok.extern.slf4j.Slf4j;
/*** @author:小关同学爱吃汉堡* @date: 2021/4/1 23:27*/
@Slf4j(topic = "c.Test1")
public class Test1 {public static void main(String[] args) {//以匿名内部类的方法创建一个线程对象Thread thread = new Thread(){@Overridepublic void run(){log.debug("running");}};//指定线程的名字thread.setName("线程1");//启动线程thread.start();log.debug("running");}
}

运行结果:
在这里插入图片描述

方法二,使用Runnable配合Thread

优点:

  1. 用Runnable更容易与线程池等高级API配合
  2. 把“线程”和“任务”(要执行的代码)分开,让任务类脱离了Thread继承体系,更灵活
  • Thread表示线程
  • Runnable表示可运行任务(线程要执行的代码)
import lombok.extern.slf4j.Slf4j;/*** @author:小关同学爱吃汉堡* @date: 2021/4/1 23:36*/
@Slf4j(topic = "c.Test2")
public class Test2 {public static void main(String[] args) {//不使用lambada表达式的写法Runnable runnable = new Runnable() {@Overridepublic void run() {log.debug("running");}};//使用lambada表达式简化式子
//        Runnable runnable = ()->{
//            log.debug("running");
//        };//也可以使用Thread的构造方法直接设置线程的名字Thread thread = new Thread(runnable,"线程2");thread.start();}
}

方法三,FutureTask配合Thread

FutureTask能够接收Callable类型的参数,用来处理有返回结果的情况。

为什么FutrueTask可以返回执行结果呢?
我们来查看FutureTask的源码,可以发现它实现了一个RunnableFuture接口,如下图:
在这里插入图片描述
RunnableFuture接口又继承了Runnable接口和Future接口,所以FutureTask间接实现了Runnable接口和Futue接口
在这里插入图片描述
Runnable接口就是线程相关的接口,而Future接口是用来返回任务的执行结果的


FutureTask怎么配合Thread创建线程?

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;/*** @author:小关同学爱吃汉堡* @date: 2021/4/2 0:52*/
@Slf4j(topic = "c.Test3")
public class Test3 {public static void main(String[] args) throws ExecutionException, InterruptedException {//使用泛型来指定返回值的类型FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {	//接收一个Callable参数@Overridepublic Integer call() throws Exception {log.debug("running");Thread.sleep(5000); //线程休眠5秒return 666;}});Thread thread = new Thread(task,"线程3");thread.start();log.debug("{}",task.get());	//这里get方法获取到返回值}
}

运行结果:
在这里插入图片描述

对于前两种创建线程方式的源码分析

第一种方法创建线程对象:

创建Thread的子类对象,通过子类对象直接重写了Thread类里面的run方法

第二种方法创建线程对象:

1.首先Runnable对象进入Thread的构造方法

public Thread(Runnable target, String name) {init(null, target, name, 0);
}

在这里插入图片描述

2.进入之后它这里将Runnable对象传给了init方法,然后它这里又将Runnable对象传给了另一个重载的init方法

    private void init(ThreadGroup g, Runnable target, String name,long stackSize) {init(g, target, name, stackSize, null, true);}

在这里插入图片描述

3.在重载的init方法里面我们找到了Runnable对象被赋值给了一个成员变量

private void init(ThreadGroup g, Runnable target, String name,long stackSize, AccessControlContext acc,boolean inheritThreadLocals) {if (name == null) {throw new NullPointerException("name cannot be null");}this.name = name;Thread parent = currentThread();SecurityManager security = System.getSecurityManager();if (g == null) {/* Determine if it's an applet or not *//* If there is a security manager, ask the security managerwhat to do. */if (security != null) {g = security.getThreadGroup();}/* If the security doesn't have a strong opinion of the matteruse the parent thread group. */if (g == null) {g = parent.getThreadGroup();}}/* checkAccess regardless of whether or not threadgroup isexplicitly passed in. */g.checkAccess();/** Do we have the required permissions?*/if (security != null) {if (isCCLOverridden(getClass())) {security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);}}g.addUnstarted();this.group = g;this.daemon = parent.isDaemon();this.priority = parent.getPriority();if (security == null || isCCLOverridden(parent.getClass()))this.contextClassLoader = parent.getContextClassLoader();elsethis.contextClassLoader = parent.contextClassLoader;this.inheritedAccessControlContext =acc != null ? acc : AccessController.getContext();this.target = target;setPriority(priority);if (inheritThreadLocals && parent.inheritableThreadLocals != null)this.inheritableThreadLocals =ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);/* Stash the specified stack size in case the VM cares */this.stackSize = stackSize;/* Set thread ID */tid = nextThreadID();}

在这里插入图片描述
4.这个成员变量在Thread自己的run方法中被使用了

    @Overridepublic void run() {if (target != null) {target.run();}}

在这里插入图片描述
如果这个Runnable对象不为null,则调用Runnable的run方法(即我们实现Runnable接口的那个方法)

关于Lambada表达式

我们可以使用Lambada表达式对一些操作进行简化。

如何判断能否使用Lambada表达式?

在jdk中,会把只有一个抽象方法的接口使用@FunctionalInterface注解来进行标记。
而带有@FunctionalInterface注解的接口就可以被Lambada表达式简化(个人认为,Lambada表达式最好看情况使用,在对Lambada表达式不是很熟悉、追求可读性的情况下,最好还是不要使用)。

相关文章:

Apache htaccess 重写假设文件存在!

假设文件 data/cache/index.html 存在。那么才重写。否则使用默认的MVC 重写。by default.fufoxmail.com RewriteEngine on RewriteCond %{DOCUMENT_ROOT}/data/cache/list_1.html -f RewriteRule ^game\/?$ data/cache/list_1.html [L] RewriteCond %{REQUEST_FILENAME} !-f …

Xamarin只言片语系列

把自己写xamarin中的一些知识点记录下来&#xff0c;分享给大家&#xff0c;欢迎指正。Xamarin只言片语1——Xamarin下的弹框Xamarin只言片语2——Xamarin下的web api操作更新中……

2021全国高校计算机能力挑战赛(初赛)C语言

3-2空间中有N个顶点&#xff08;顶点坐标用x,y,z表示&#xff09;&#xff0c;从中找出能构成三角形图形的最大面积&#xff0c;输出该面积。 #include<stdio.h> #include<math.h> int main() {int n,m0;double a,b,c,p,res[1000],s[1000][3];scanf("%d"…

藤摇椅游戏道具制作全流程讲解视频教程

藤摇杆|一个完整的游戏资产工作流程 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 含工程素材 语言&#xff1a;英语中文字幕&#xff08;根据原英文字幕机译更准确&#xff09;原英文字幕 |时长:25节课(9h 57m) |大小:8.35 GB 通过模拟游…

SpringBoot复习:2(@Configuration注解)

Configuration注解 Configuration注解的作用是代替以前我们使用的xml配置文件&#xff0c;被注解的类就是配置类&#xff0c;其内部包含有一个或多个被Bean注解的方法&#xff0c;这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类…

C/C++中constkeyword

今天在做一个趋势笔试题的时候。才让我有了系统把constkeyword好好总结一下的冲动&#xff0c;由于这个关键词大大小小好多地方都出现过&#xff0c;出现频率很高&#xff0c;而每次仅仅是简短的把答案看了一下&#xff0c;没有真正将其整个使用方法弄透&#xff0c;立即要找工…

hdu5185 dp:和为n且满足后一项是前一项或者+1的数列个数

其实是很裸的dp&#xff0c;竟然放在第四题 dp[i][j]表示当前放j和为i的方案数 dp[0][0]1; dp[i][j]dp[i-j][j-1]dp[i-j][j]; 1 #include<stdio.h>2 #include<string.h>3 #include<math.h>4 #include<algorithm>5 using namespace std;6 int dp[50005]…

2021全国高校计算机能力挑战赛(决赛)Java

计算奖品价格标准差 import java.util.*;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt();float sum0;int total_n0;int[] numnew int[10];float[] prinew float[10];for (int i 0; i <n ; i) {num[i…

Python训练营2021:构建8个真实世界的Python项目

时长:19h 27m |视频:. MP4&#xff0c;1280720 30 fps |音频:AAC&#xff0c;44.1 kHz&#xff0c;2ch |大小:9.54 GB 语言&#xff1a;英语中英文字幕 机译 从Python Web开发的初学者到专家:学习使用SQLite、Tkinter开发真实的Django应用程序 你会学到: 了解如何使用像Djang…

SpringBoot复习:3(@Conditional)

Conditional 条件装配&#xff1a;满足Conditional指定的条件时&#xff0c;则进行组件注入 Conditional注解下面包含许多注解&#xff0c;如下图&#xff1a; 这些注解各有各的功能&#xff0c;这里挑几个来记录一下。 ConditionalOnBean注解 个人理解&#xff1a;当该注…

HDU——1106排序(istringstream的使用、STLvector练习)

排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 46057 Accepted Submission(s): 13221 Problem Description输入一行数字&#xff0c;如果我们把这行数字中的‘5’都看成空格&#xff0c;那么就得到一行用…

AssertValid函数学习

转自http://tsitao.blog.163.com/blog/static/29795822006914105840496/ VC的调试中&#xff0c;AssertValid和Dump函数的应用 CObject::AssertValid 成员函数提供对对象内部状态的运行时检查。虽然从 CObject 派生类时不须要重写 AssertValid&#xff0c;但能够通过重写使您的…

数值分析第一次作业-牛顿迭代法求解二元非线性方程组

1、问题 求解如下方程组: 2、算法 3、代码实现 # *coding:utf-8 * import math delta 5e-6 ;eps 1e-6 x0 1;y0 1 er 1;k 0 def z(x,y):return math.sin(x*y)*math.exp(-0.1*(x**2y**2x*y2*x)) def f(x,y):return y*math.cos(x*y)-0.1*(2*xy2)*math.sin(x*y) def g(x,y…

Maya制作风格化的女性跑步动画学习教程

时长:2h 11m |视频:. MP4 1280720&#xff0c;30 fps(r) |音频:AAC&#xff0c;48000 Hz&#xff0c;2ch |大小解压后:1.56 GB 含参考素材 流派:电子学习|语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 通过在Autodesk Maya中提供专业外观…

安卓手机抓包实战

最近因为要做一个项目&#xff0c;所以需要对手机给家电发送的请求进行抓取&#xff0c;于是上网找了许多教程&#xff0c;但都不怎么理想&#xff0c;最终经过两个晚上的艰辛奋斗&#xff0c;终于让我找到了方法抓取到了手机发送的请求&#xff0c;写一篇博客记录一下这个过程…

导入drupal中文语言包

http://lugir.com/book/export/html/399转载于:https://www.cnblogs.com/qinqiu/p/5174062.html

JavaScript引擎大战:Google提出StrongMode和SoundScript议案,增强V8性能

JavaScript 引擎性能大战硝烟迷漫&#xff0c;Chrome V8 引擎团队宣布了一个新的计划&#xff0c;在这个计划里他们介绍了两个新的虚拟机概念&#xff1a;强化模式&#xff08;StrongMode&#xff09;和强化脚本&#xff08;StrongScript&#xff09;。\\强化模式是 ES5 严格模…

数值分析第三次作业-常微分方程的数值解法

一、欧拉方法 二、修正的欧拉方法 2.1.梯形公式 将问题&#xff08;*&#xff09;的解表成积分形式&#xff0c;用数值积分方法离散化。例如&#xff0c;对微分方程

SYNCHRO 4D可视化调度学习教程 SYNCHRO 4D: Visual Scheduling

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 技能水平:初级|流派:电子学习|语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:3h 14m |大小:1.36 GB 含课程练习文件 课程获取&#xff1a;SYNCHR…

SpringBoot复习:4(@ImportResource)

ImportResource注解 作用&#xff1a;这个注解可以用来导入Spring的配置文件&#xff08;bean.xml文件&#xff09;。 适用场景&#xff1a; 可以试想一下这样一个场景&#xff0c;老板要你将原来的Spring项目改成SpringBoot项目&#xff0c;原项目底下有一大堆的bean.xml文件…

YTU 2723: 默认参数--求圆的面积

2723: 默认参数--求圆的面积 时间限制: 1 Sec 内存限制: 128 MB提交: 206 解决: 150题目描述 根据半径r求圆的面积, 如果不指定小数位数,输出结果默认保留两位小数。 部分代码已给定如下&#xff0c;只需要提交缺失的代码。 #include <iostream> #include <iomanip&…

jmeter内存溢出处理方式记录

方法一&#xff1a; 使用jmeter进行压力测试时 遇到一段时间后报内存溢出outfmenmory错误&#xff0c;导致jmeter卡死了&#xff0c;先尝试在jmeter.bat中增加了JVM_ARGS"- Xmx2048m -Xms2048m -Xmn256m -XX:PermSize128m -Xss256k"&#xff0c;但结果运行时间增加了…

支持向量机学习笔记1

1、支持向量机是一种二类分类模型。它的模型基本定义是特征空间上间隔最大的线性分类器。 2、核函数的引入&#xff0c;使得支持向量机可以进行非线性分类。 3、支持向量机也可以完成多类别分类&#xff08;将在后面介绍&#xff09; 4、支持向量机的学习策略为间隔最大化&a…

C4D入门学习教程

MP4 |视频:AVC&#xff0c;1280720 30 fps |音频:AAC&#xff0c;48 KHz&#xff0c;2 Ch |时长:2h 12m 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:560M C4D是一个有抱负的运动图形艺术家和设计师的重要工具。借助C4D&#…

SpringBoot复习:5(配置绑定)

配置绑定 在SpringBoot中我们如何读取到properties文件中的内容&#xff0c;并且把它封装到JavaBean中&#xff0c;以供随时使用呢&#xff1f; 我们可以使用以下两种方式来实现。 方法一&#xff1a;ConfigurationPropertiesComponent 第一种方法&#xff0c;我们可以使用C…

是男人就下100层【第五层】——2048游戏从源代码到公布市场

上一篇《是男人就下100层【第五层】——换肤版2048游戏》中阳光小强对2048游戏用自己的方式进行了实现&#xff0c;并分享了核心源码&#xff0c;这一篇阳光小强打算将该项目的全部源码公开并结合这个实例在这篇文章中介绍一下怎样加入广告和实现分享功能。终于执行效果例如以下…

zabbix菜单出现问号乱码问题

zabbix菜单出现问号乱码问题 安装后zabbix&#xff0c;设置成中文后&#xff0c;发现菜单出现了好多的乱码&#xff0c;google之后才知道这与zabbix数据库字符集设置有关。查看当前的默认字符集&#xff1a;mysql> show create database zabbix;---------------------------…

什么是Closed-form solution?

最近看论文&#xff0c;讨论微分方程解时遇到closed-form solution概念&#xff0c;上网检索&#xff0c;找到一个较浅显易懂的解释如下。 与工学院所学的微分方程不同的是&#xff0c;工学院的学生一般都是学如何把特定的微分方程的解用基本函数&#xff08;例如多项式、三角函…

c4d中的3D插图制作视频教程 Skillshare – 3D Illustration in Cinema 4D

技能分享——C4D的3D插图 教程大小解压后&#xff1a;1.33G 1920X1080 mp4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; C4D是众所周知的平易近人的软件&#xff0c;也是进入3D艺术梦幻世界的理想门户。 加入马特的这个课程&#xff0c…

SpringSecurity学习:1(第一个SpringSecurity项目)

此博客是记录自己学习过程的记录 第一个SpringSecurity项目 导入依赖 详细的步骤我就不多说了&#xff0c;使用IDEA创建过SpringBoot项目的人一般都能看懂。 这一步我们可以在使用IDEA创建SpringBoot项目的时候完成&#xff0c;如下图&#xff1a; 在创建SpringBoot项目时&a…