热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

3.Java并发编程之创建线程的三种方法

学习之前建议先看2.Java并发编程之进程和线程,并行和并发这篇博文科普下Java创建线程的三种方法以及线程池的几种类型。1如何创建线程&#

学习之前建议先看 2. Java并发编程之 进程和线程,并行和并发

这篇博文科普下Java 创建线程的三种方法以及线程池的几种类型。

1 如何创建线程?



    1. 继承自Thread类 (不推荐)

    1. 实现Runnable接口(无返回值)

    1. 实现Callable接口(有返回值)

1.1 第一种方法:继承Thread 类

步骤:
1.继承自Thread类
2.重写run方法

public class MyThreadOne extends Thread {
@Override
public void run() {
super.run();
//我们可以通过调用 Thread.currentThread().getName(); 获取当前线程名称
System.out.println("当前线程名称:"+Thread.currentThread().getName()+":Do Somthing");
}
}

调用方式

public class MyThreadOneTest {
public static void main(String[] args) {
//创建一个继承自Thread类的实例对象
MyThreadOne myThreadOne=new MyThreadOne();
//创建一个线程使用默认的线程名称thread-1
//Thread myThread=new Thread(myThreadOne);
//创建一个线程并指定线程名称
Thread myThread=new Thread(myThreadOne,"My Thread One");
//启动线程
myThread.start();
}
}

打印结果:

当前线程名称:My Thread One:Do Somthing

这种方式弊端很明显,因为一旦我们当前类已经继承了其他类作为父类,那么就没有办法再继承Thread类了(Java中类是单继承的),因此这种方式几乎不会使用。

有没有更好的方法呢? 有,那就是接下来讲的第二种方法。

1.2 第二种方法:实现Runable接口


我们知道Java之中虽然类不可以多继承,但是接口却可以多继承,并且一个类可以实现多个接口。

步骤:
1.实现Runnbale接口
2.重写run方法

public class MyThreadTwo implements Runnable {
@Override
public void run() {
//我们可以通过调用 Thread.currentThread().getName(); 获取当前线程名称
System.out.println("当前线程名称:"+Thread.currentThread().getName()+":Do Somthing");
}
}

调用方法如下

public class MyThreadTwoTest {
public static void main(String[] args) {
//创建一个实现Runnable接口类的实例对象
MyThreadTwo myThreadTwo=new MyThreadTwo();
//创建一个线程使用默认的线程名称thread-1
//Thread myThread=new Thread(myThreadTwo);
//创建一个线程并指定线程名称
Thread myThread=new Thread(myThreadTwo,"My Thread Two");
//启动线程
myThread.start();
}
}

执行结果如下:

当前线程名称:My Thread Two:Do Somthing

1.3 第三种方法:实现Callable 接口


第二种方法比第一种方法得到了优化,但是仍然有一个问题,假如我们想要线程结束后需要有返回值,那么该怎么做呢?

步骤一:

  1. 实现Callable接口
  2. 重写接口的call()方法

V是泛型,可以是String,也可以是任意Object对象

public class MyThreadThree implements Callable {
@Override
public String call() throws Exception {
//我们可以通过调用 Thread.currentThread().getName(); 获取当前线程名称
System.out.println("当前线程名称:"+Thread.currentThread().getName()+":Do Somthing");
return "thread three result";
}
}

3.调用如下:

这里我们注意到和之前有些改动。

  • 1.我们不能再使用Thread类直接包装我们的自定义类
  • 2.需要new FutureTask<>(myThreadThree)包装我们的自定义类

FutureTask futureTask&#61;new FutureTask<>(myThreadThree);

  • 3.然后使用Thread类包装下FutureTask

Thread myThread&#61;new Thread(futureTask,"My Thread Three");

  • 4.futureTask.get() 获取线程返回的结果

代码如下&#xff1a;

public class MyThreadThreeTest {
public static void main(String[] args) {
//创建一个实现Callable接口类的实例对象
MyThreadThree myThreadThree&#61;new MyThreadThree();
//V 是泛型&#xff0c;可以是String 也可以是任意Object类型
//FutureTask 中的V要和 Callable V类型保持一致
//使用FutureTask对象来包装实现Callable接口类的实例对象
FutureTask futureTask&#61;new FutureTask<>(myThreadThree);
//创建一个线程使用默认的线程名称thread-1
//Thread myThread&#61;new Thread(futureTask);
//创建一个线程并指定线程名称
Thread myThread&#61;new Thread(futureTask,"My Thread Three");
//启动线程
myThread.start();
try {
//获取线程返回的结果
String result&#61; futureTask.get();
//打印线程返回的结果
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}

执行结果&#xff1a;

当前线程名称:My Thread Three:Do Somthing
thread three result

参考文献&#xff1a;
《Java并发编程的艺术》
《Java编程思想》
《码出高效Java开发手册》

本节完~

没看够&#xff0c;继续看 4. Java并发编程之使用线程池管理线程


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
封鹏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有