线程的故事:我的3位母亲成就了优秀的我!

作者 | 王磊

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

声明:本故事纯属虚构,如果雷同那就是真事了!

大家好,我是线程,我的英文名叫 Thread,别看我现在风光无限,好像人尽皆知的样子,然而我的身世却悲惨离奇。

我出身在一个小山村,那是一个与世隔绝的世外桃源,然而年纪轻轻的我,却展现出了与众不同的性格。比如:当身边的同龄人还在沉浸于玩泥巴的喜悦时,我就开始思考如何避免下雨天对出行造成的阻碍?当身边的同龄人还在沉浸于夕阳下的奔跑时,我已经开始思考为什么太阳会东升西落?而我们人类又为什么会生存在地球上?于此可见一斑。

当时的我在所有人眼里就是一个“怪人”,村里面的阿猫、阿狗走路都要躲着我。但我的母亲懂我,她知道这个小伙子器宇不凡、骨骼惊奇,必是练武奇才,将来保护宇宙的重任和维护世界和平的重任可能要交付与我这个神童身上了,于是在我刚满 3 岁那天,母亲就把我过继给了她的一位远房亲戚了。

首位母亲:继承Thread

接下来我要把我的出生过程演示给你看,这也是我的第一段人生经历。

创建方式一

线程最原始的创建方式,只需要继承 Thread 类,重写 run() 方法即可,实现代码如下:

// 创建方式 1:继承 Thread
class MyThread extends Thread {@Overridepublic void run() {System.out.println("你好,线程~");}
}
// 测试
public class ThreadExample {public static void main(String[] args) {// 创建线程Thread thread = new MyThread();// 启动线程thread.start();}
}

变种方法

以上创建线程的方式略显繁琐,我们也可以使用匿名对象的方式,在创建 Thread 类的时候就直接重写 run() 方法,实现代码如下:

// 变种 1:匿名方式创建线程
Thread t1 = new Thread() {@Overridepublic void run() {System.out.println("线程变种");}
};
// 启动线程
t1.start();

继承Thread的缺点

Java 语言的设计是单继承,所以当继承了 Thread 之后,就不能再继承其他类了。

也就是说,如果我一直呆在亲生母亲(extends Thread)的身边,那么就得不到好的教育,所以长大之后也注定会普普通通,这可能就是母亲把我过继给远房亲戚的原因吧。

第二位母亲:实现Runnable

在 Java 语言中,虽然不能实现多继承,但可以实现多接口,所以我在第二位母亲家,过得也算如鱼得水。

创建方式二

和继承 Thread 类差不多,实现 Runnable 接口也是重写 run() 方法,具体实现代码如下:

public class ThreadExample2 {// 创建方式 2:实现 Runnable 接口static class MyThread implements Runnable {@Overridepublic void run() {System.out.println("你好,线程~");}}// 代码测试public static void main(String[] args) {// 创建 Runnable 子类MyThread myThread = new MyThread();// 创建线程Thread thread = new Thread(myThread);// 启动线程thread.start();}
}

变种方法1:匿名Runnable

以上实现 Runnable 的接口有更简单的实现方法,我们可以使用匿名 Runnable 来创建一个线程,如下代码所示:

// 变种 1:匿名 Runnable 方式
Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("我是线程变种方法~");}
});
// 启动线程
t2.start();

变种方法2:Lambda创建Runnable

在 JDK 8 之后,我们可以使用 Lambda 表达式来操作代码了,所以对于创建匿名 Runnable 类,我们也有了更简单的实现方法,如下代码所示:

// 变种 2:使用 Lambda 匿名 Runnable 方式
Thread t3 = new Thread(() -> {System.out.println("我是变种 2~");
});
// 启动线程
t3.start();

注意:以上实现代码只支持 JDK 1.8+ 版本。

第三位母亲:村里的首富

虽然我的前两位母亲对我都很好,但对于我这样一个气宇轩扬、骨骼惊奇将来要拯救宇宙和维护世界和平的少年来说,只在国内混未免局限性太大,所以我一直想去大洋彼岸追寻自己的梦想,然而以「前两位」母亲的财力不足以支撑我这样做。

然而我的第二个家庭和村里的首富一家是至交,得知我的志向之后,他们一家愿意倾囊相授,举一家之力帮我去大洋彼岸追寻我的梦想。于是在感激之余,我的第二位母亲让我当场认下首富一家为我的干爹、干妈。就这样,我就有了第三位母亲了。

创建方式三

前两种创建方式虽然不错,但都不能接收线程执行之后的返回值,于是在 JDK 1.5 之后就加入了 Callable 和 Futrue,用于接收线程执行之后的返回值,具体的实现代码如下:

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;/*** 线程创建示例 3*/
public class CreateThreadExample3 {// 创建方式 3:实现 Callable 接口static class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int num = new Random().nextInt(10);System.out.println("生成随机数:" + num);return num;}}// 代码测试public static void main(String[] args) throws ExecutionException, InterruptedException {// 创建 Callable 子对象MyCallable callable = new MyCallable();// 使用 FutureTask 配合 Callable 子对象得到执行结果FutureTask<Integer> futureTask = new FutureTask<>(callable);// 创建线程Thread thread = new Thread(futureTask);// 启动线程thread.start();// 得到线程执行的结果int result = futureTask.get();System.out.println("主线程中拿到子线程执行结果:" + result);}
}

以上代码的执行结果如下:



从以上结果可以看出,使用 Callable 配合 FutrueTask 可以正确拿到线程执行之后的返回值。而我的故事也在这里结束了,我最终不负三位母亲所望,虽不能拯救宇宙和维护世界和平,但却也能在程序界作出自己的一些贡献,这就是我和我三位母亲的故事。

总结

本文使用第一人称“我”(Thread)的视角讲了线程创建的三种方式,第一种是继承 Thread,但因为 Java 语言不允许多继承,所以当继承了 Thread 之后就不能继承其他类了,于是就有了第二种方式实现 Runnable 接口的方式。然而前两种实现虽然可以创建线程,但不能接收线程执行之后的返回值,于是就有了第三种实现 Callable,通过它我们可以取得线程执行之后的返回值。

原创不易,希望本文的写作方式你们能喜欢。都看到这了,点个赞再走吧!


往期推荐

Semaphore自白:限流器用我就对了!


CyclicBarrier:人齐了,老司机就发车了!


CountDownLatch:别浪,等人齐再团!



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

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

相关文章

c ++查找字符串_C ++结构| 查找输出程序| 套装3

c 查找字符串Program 1: 程序1&#xff1a; #include <iostream>#pragma pack(1)using namespace std;typedef struct{int A;int B;char c1;char c2;} S;int main(){cout << sizeof(S);return 0;}Output: 输出&#xff1a; In a 32-bit system: 10In a 64-bit sy…

7种内存泄露场景和13种解决方案!

前言Java通过垃圾回收机制&#xff0c;可以自动的管理内存&#xff0c;这对开发人员来说是多么美好的事啊。但垃圾回收器并不是万能的&#xff0c;它能够处理大部分场景下的内存清理、内存泄露以及内存优化。但它也并不是万能的。不然&#xff0c;我们在实践的过程中也不会出现…

Android如何关闭Application

转载自&#xff1a;http://blog.csdn.net/hello_kevinkuang/article/details/7443005 程序启动后&#xff0c;先执行Application.onCreate()&#xff0c;再执行Activity.onCreate()。如果没有生成自己的Application&#xff0c;那么系统会为你自动生成一个。退出程序时我们一般…

Android Sqlite

2019独角兽企业重金招聘Python工程师标准>>> 一、http://lansuiyun.iteye.com/blog/1246430 good! 二、增加新表时&#xff0c;需要更新版本号。 三、Android 使用自定义cursorAdapter&#xff1a; http://blog.csdn.net/buaalei/article/details/6064792 good! 四…

优雅统计代码耗时的4种方法!

来源&#xff1a;jitwxs.cn/5aa91d10.html一、前言代码耗时统计在日常开发中算是一个十分常见的需求&#xff0c;特别是在需要找出代码性能瓶颈时。可能也是受限于 Java 的语言特性&#xff0c;总觉得代码写起来不够优雅&#xff0c;大量的耗时统计代码&#xff0c;干扰了业务逻…

小黑小波比.git clone报错解决方案

2019独角兽企业重金招聘Python工程师标准>>> zmzpzmzp1:~/data$ git clone git192.168.199.199:zmw/s910.git 正克隆到 s910... ssh: connect to host 192.168.199.199 port 22: Connection refused fatal: Could not read from remote repository.Please make sure…

Android 运行时异常 Binary XML file line # : Error inflating class

今天在做一个二维码扫描的项目的时候出现了一个错误&#xff1a; android.view.InflateException: Binary XML file line #12: Error inflating class com.zxing.view.ViewfinderView 项目里面的代码是我从以前项目里面拷贝的&#xff0c;可是各种报错&#xff0c;找了很多资…

一个sql注入直接把我们服务搞挂了

前言最近我在整理安全漏洞相关问题&#xff0c;准备在公司做一次分享。恰好&#xff0c;这段时间团队发现了一个sql注入漏洞&#xff1a;在一个公共的分页功能中&#xff0c;排序字段作为入参&#xff0c;前端页面可以自定义。在分页sql的mybatis mapper.xml中&#xff0c;orde…

reinterpret_cast和static_cast的总结

主要参考&#xff1a;http://blog.csdn.net/querw/article/details/7387594 http://www.cnblogs.com/jerry19880126/archive/2012/08/14/2638192.html http://www.cnblogs.com/ider/archive/2011/07/30/cpp_cast_operator_part3.htmlhttp://bbs.csdn.net/topics/390249118 关键…

Android实现点击两次返回键退出

转自 http://blog.sina.com.cn/s/blog_4fd2a65a0101gg2o.html 在做安卓应用是我们经常要判断用户对返回键的操作&#xff0c;一般为了防止误操作都是在用户连续按下两次返回键的时候提示用户是否退出应用程序。 第一种实现的基本原理就是&#xff0c;当按下BACK键时&#xff0c…

c#hello world_C#| 打印消息/文本(用于打印Hello world的程序)

c#hello worldTo print the message/text or any value – we use two functions: 要打印消息/文本或任何值–我们使用两个功能&#xff1a; Console.Write (); Console.Write(); This function displays text, values on the output device and does not insert a new line …

Java双刃剑之Unsafe类详解

前一段时间在研究juc源码的时候&#xff0c;发现在很多工具类中都调用了一个Unsafe类中的方法&#xff0c;出于好奇就想要研究一下这个类到底有什么作用&#xff0c;于是先查阅了一些资料&#xff0c;一查不要紧&#xff0c;很多资料中对Unsafe的态度都是这样的画风&#xff1a…

Java知多少(66)输入输出(IO)和流的概述

输入输出&#xff08;I/O&#xff09;是指程序与外部设备或其他计算机进行交互的操作。几乎所有的程序都具有输入与输出操作&#xff0c;如从键盘上读取数据&#xff0c;从本地或网络上的文件读取数据或写入数据等。通过输入和输出操作可以从外界接收信息&#xff0c;或者是把信…

单行 - JAVA 条件表达式

public class ExpressionUse{//It’s the main() function.//每个应用程序都应该有一个main()函数体。public static void main(String[] args){int a10;int b1;int c(a<b)?a:b;System.out.println("a"a);System.out.println("b"b);System.out.println…

额!Java中用户线程和守护线程区别这么大?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 语言中线程分为两类&#xff1a;用户线程和守护线程&#xff0c;而二者之间的区别却鲜有人知&#xff0c;所以本文磊…

c++中int向量初始化_以不同的方式在C ++中初始化2D向量

c中int向量初始化Prerequisite: Initialize 1D vector 先决条件&#xff1a; 初始化一维向量 Before discussing about the initialization techniques let us state what a 2D vector is. A 2D vector in simple sense is a matrix having rows and column. In other words, …

EasyUI-右键菜单变灰不可用效果

使用过EasyUI的朋友想必都知道疯狂秀才写的后台界面吧&#xff0c;作为一个初学者我不敢妄自评论它的好坏&#xff0c;不过它确实给我们提供了一个很好框架&#xff0c;只要在它的基础上进行修改&#xff0c;基本上都可以满足我们开发的需要。 知道“疯狂秀才”写的后台界面已经…

Oracle中insert into select和select into的区别

文章转自&#xff1a;http://www.linuxidc.com/Linux/2012-09/70984.htm 在Oracle中&#xff0c;将一张表的数据复制到另外一个对象中。通常会有这两种方法&#xff1a;insert into select 和 select into from。 前者可以将select 出来的N行(0到任意数)结果集复制一个新表中…

ThreadLocal中的3个大坑,内存泄露都是小儿科!

我在参加Code Review的时候不止一次听到有同学说&#xff1a;我写的这个上下文工具没问题&#xff0c;在线上跑了好久了。其实这种想法是有问题的&#xff0c;ThreadLocal写错难&#xff0c;但是用错就很容易&#xff0c;本文将会详细总结ThreadLocal容易用错的三个坑&#xff…

java中为按钮添加图片_如何在Java中为字符串添加双引号?

java中为按钮添加图片In Java, everything written in double-quotes is considered a string and the text written in double-quotes is display as it is. 在Java中&#xff0c; 双引号中的所有内容均视为字符串&#xff0c;而双引号中的文本按原样显示。 Suppose, if we wa…