多线程调用同一个对象的方法_多线程之如何创建和使用线程

e5a152ebb9d6fbde7f7eea0373ff640d.png

一、创建线程和使用线程方式

1.1 继承Thread

让线程类继承自Thread类,然后重写run(),把需要多线程调用的代码放到run()中。但是需要开启线程的时候不能调用run方法,而是需要调用start()方法。

/***  本类用于演示第一种实现多线程的方式*/
class MyThread extends Thread{// 需要我们使用多进程运行的代码就写在run方法里@Overridepublic void run() {		for (int i = 1; i < 5; i++) {	System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);}}
}
public class ThreadDemo01 extends Thread{public static void main(String[] args) {MyThread thread = new MyThread();thread.start();for (int i = 1; i < 5; i++) {	System.out.println(Thread.currentThread().getName() + "线程正在运行======" + i);}}
}

运行结果:(两个线程同时运行,争抢cpu,每次执行结果不固定)

095324984285411420146f60baf28e6b.png

12.2 实现Runnable接口

需要我们创建的线程类实现Runnable接口。实现run方法,把需要多线程调用的代码写在run方法中。由于Runnable接口中只有一个run方法,所以不能直接调用start()。这个时候需要创建一个Thread类的对象来帮助我们开启线程。创建这个Thread类对象的时候需要将我们的线程类作为参数传递给Thread对象。

/***  本类用于演示第二种实现多线程的方式*/
class MyThread2 implements Runnable{// 需要我们使用多进程运行的代码就写在run方法里@Overridepublic void run() {		for (int i = 1; i < 5; i++) {	System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);}}
}public class ThreadDemo02 {public static void main(String[] args) {	 MyThread2 myThread2 = new MyThread2();// myThread2.run();// 由于Runable接口只有一个run方法,所以实现Runnable接口的这种方式,线程本身没有start方法。// 但是必须要调用start方法才能开启多线程,所以需要创建Thread类的对象,把我们的线程类作为参数传递给构造方法。Thread thread = new Thread(myThread2);thread.start();for (int i = 1; i < 5; i++) {	System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);}	}
}

运行结果:(两个线程同时运行,争抢cpu,每次执行结果不固定)

de0feecec466505cd78dd1addde3f48b.png

2.3 实现Callable接口

采用实现Callable接口实现多线程启动方式以上两种的方式不太一样,下面就看一下怎样启动采用实现Callable接口的线程。

第一步:定义一个类实现Callable接口,并且指定call()返回值的类型。将业务逻辑写在call()方法中。

第二步:创建FutureTask对象,并将Callable对象传入FutureTask的构造方法中。

第三步:实例化Thread对象,并在构造方法中传入FurureTask对象。

第四步:启动线程

/***  本类用于演示第三种实现多线程的方式*/
class MyCallable implements Callable<String>{@Overridepublic String call() throws Exception {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~" + i);}return "MyCallable接口执行完成!";}	}
public class ThreadDemo03 {public static void main(String[] args) throws  Exception {// 1、创建FutureTask实例,创建MyCallable实例FutureTask<String> futureTask = new FutureTask<>(new MyCallable());// 2、创建Thread实例,来执行futureTaskThread thread = new Thread(futureTask);thread.start();// 3、主线程for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~" + i);}// 4、获取执行结果System.out.println(futureTask.get());}
}

运行结果:

18167ebcc76461795e4b68d46fd1b842.png

1.4 线程池

在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。

线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。

那么,我们应该如何创建一个线程池那?Java中已经提供了创建线程池的一个类:Executor而我们创建时,一般使用它的子类:ThreadPoolExecutor。

第一步:使用Executors获取线程池对象;

第二步:通过线程池获取对象获取线程并执行Runable子类实例;

class MyThread4 implements Runnable{// 需要我们使用多进程运行的代码就写在run方法里@Overridepublic void run() {		for (int i = 1; i < 5; i++) {	System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);}}
}
public class ThreadDemo04 {public static void main(String[] args) {	// 第一步:使用Executors获取线程池对象;ExecutorService executorService = Executors.newFixedThreadPool(10);// 第二步:通过线程池获取对象获取线程并执行Runable实例;executorService.execute(new MyThread4());		for (int i = 1; i < 5; i++) {	System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);}		}
}

运行结果:

99d99d14bee9d16ec1a7e365a94ff7f2.png

二、总结

2.1 实现接口和继承Thread类比较

(1)接口更适合多个相同的程序代码的线程去共享同一个资源。

实现Runnable接口这种方式,可以把多线程之间相同的操作放到一个Runnable接口的run方法中实现,然后可以通过多个thread来执行同一个Runnable实例。可以达到在一个地方开发,多个地方使用,做到代码的复用。

(2)接口可以避免Java中单继承的局限性。

Java的设计是单继承的设计,如果采用继承Thread的方式实现多线程,则不能继承其他的类,就会错失继承很多父类方法。

(3)接口代码可以被多个线程共享,代码和线程独立。

(4)线程池只能放入实现Runnable或Callable接口的线程,不能直接放入继承Thread的类。

2.2 Runnable和Callable接口比较

A、相同点:

(1)两者都是接口;

(2)都可以用来编写多线程程序;

(3)两者都需要调用Thread.start()启动线程;

B、不同点:

(1)实现Callable接口的线程能返回执行结果;而实现Runnable接口的线程不能返回结果;若需要用这个线程执行任务,不需要控制则建议使用Runnable,若需要动态监控任务则建议使用Callable。

(2)Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法不允许抛异常。

(3)实现Callable接口的线程可以调用Future.cancel取消执行,而实现Runnable接口的线程不能。

注意点:Callable接口支持返回执行结果,此刻需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取“将来”结果;不调用此方法时,主线程不会阻塞。只能在不需要并发的地方调用get()方法。

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

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

相关文章

[Intel Edison开发板] 02、Edison开发板入门

一、前言 Start from the link: 开始学习的链接 上面链接是官网的教程&#xff0c;按照教程可以开发板入门&#xff1a; 其中第一步是了解开发板&#xff0c;涉及到如何组装、如何连线、一些主要的接口简单介绍等信息&#xff1b;第二步主要是介绍如何用官方提供的工具进行配置…

几种纯css布局的导航栏

1.垂直导航栏 页面效果 <ul class"nav"><li><a href"home.htm">Home</a></li><li><a href"about.htm">About</a></li><li><a href"services.htm">Services</a&…

poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...

EXCEL函数公式大全之利用FREQUENCY函数数组公式统计不同区间数据个数。EXCEL函数与公式在工作中使用非常的频繁&#xff0c;会不会使用公式直接决定了我们的工作效率&#xff0c;今天我们来学习一下提高我们工作效率的函数FREQUENCY函数和数组公式。今天我们的例子是统计学生在…

洛谷 P2735 电网 Electric Fences Label:计算几何--皮克定理

题目描述 在本题中&#xff0c;格点是指横纵坐标皆为整数的点。 为了圈养他的牛&#xff0c;农夫约翰&#xff08;Farmer John)建造了一个三角形的电网。他从原点&#xff08;0,0&#xff09;牵出一根通电的电线&#xff0c;连接格点(n,m)&#xff08;0<n<32000,0<m&l…

word文档打印 自动编码_办公室文件打印有哪些技巧 办公室文件打印技巧介绍【图文】...

办公室文件打印实用技巧三则一. 打印文件直接装订——逆序打印相信使用Word打印过长篇文档的朋友一定都清楚&#xff0c;打印完成后的装订一直是个麻烦事儿&#xff0c;因为文件由打印机打出时&#xff0c;第一页肯定会在最下面&#xff0c;装订之前总要费时费力的把纸张按顺序…

Strategy 策略模式

意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 动机 策略模式为了适应不同的需求&#xff0c;只把变化点封装了&#xff0c;这个变化点就是实现不同需求的算法&#xff0c;但是&#xff0c;用户需要知道各种…

用 Flask 来写个轻博客 (1) — 创建项目

目录 目录前言扩展阅读部署开发环境创建 Github 项目前言 一步一步的实现一个 Flask 轻博客项目启动&#xff0c;最新的代码会上传到 Github。 扩展阅读 欢迎使用 Flask — virtualenv 部署开发环境 连接 GitHubhostnamectl set-hostname flask-dev # 设置 hostname ssh-keyg…

java后期发展方向_Java程序员的4个职业发展方向,该如何把握黄金5年?

在Java程序界流行着一种默认的说法叫“黄金5年”&#xff0c;意思是说&#xff0c;一个Java程序员从入职的时候算起&#xff0c;前五年我选择直接影响着整个职业生涯的发展方向和薪资走向。而这5年&#xff0c;也决定了一个程序员能否成为职业大牛的可能。那么&#xff0c;在这…

sourcetree不好做到的一些git操作

2019独角兽企业重金招聘Python工程师标准>>> 日常中我们有很多操作通过sourcetree就可以实现界面化操作&#xff0c;但是有一些场景不好去实现&#xff0c;这里总结下&#xff1a; 场景1&#xff1a;我们有个A分支&#xff0c;需要跟master分支合并等待上线&#xf…

vb.net 窗体接收键盘事件_(十五)C#WinFrom自定义控件系列-键盘(二)

前提入行已经7,8年了&#xff0c;一直想做一套漂亮点的自定义控件&#xff0c;于是就有了本系列文章。本系列文章将讲解各种控件的开发及思路&#xff0c;欢迎各位批评指正。此系列控件开发教程将全部在原生控件基础上进行重绘开发&#xff0c;目标的扁平化、漂亮、支持触屏。如…

centos下cmake安装

步骤一、安装gcc等必备程序包&#xff08;已安装则略过此步&#xff0c;用gcc -v检测&#xff09; yum install -y gcc gcc-c make automake 步骤二、安装wget &#xff08;已安装则略过此步&#xff09; yum install -y wget 步骤三、获取CMake源码包 wget http://www.cmake.…

恩智浦智能车大赛2020_内蒙古科技大学第九届智能车大赛校内公开赛总决赛

为了激发学生的创新意识&#xff0c;提高学生的动手能力&#xff0c;培养团队合作意识&#xff0c;秉承“实践源于真知&#xff0c;创新放飞梦想”的思想。2020年12月6日&#xff0c;内蒙古科技大学第九届智能车大赛总决赛如约而至。本次大赛有来自各院系的223支队伍报名参加了…

解读直播连麦与点播加密

近年来&#xff0c;直播热潮持续升温。有需求就会有变革&#xff0c;直播的相关技术也在不断更新&#xff0c;为直播行业带来更好地服务。如&#xff1a;直播连麦与点播加密技术等。 直播连麦&#xff0c;即主播与连麦者通过互动直播中心进行实时互动&#xff0c;信息在云端混流…

血红蛋白判断access程序答案_普渡大学开发智能手机应用程序 帮助评估贫血症情况...

医生诊断贫血疾病的方法之一&#xff0c;就是通过观察患者的眼皮&#xff0c;判断眼皮是否发红&#xff0c;从而判断红细胞的数量。但对医生来说&#xff0c;面临的挑战是&#xff0c;这种简单的测试不够精确&#xff0c;无法不从患者身上抽取血样就能给出诊断。美国普渡大学的…

学习笔记:AC自动机

话说AC自动机有什么用......我想要自动AC机 AC自动机简介&#xff1a; 首先简要介绍一下AC自动机&#xff1a;Aho-Corasick automation&#xff0c;该算法在1975年产生于贝尔实验室&#xff0c;是著名的多模匹配算法之一。一个常见的例子就是给出n个单词&#xff0c;再给出一段…

thinkphp一句话疑难解决笔记

URL_PATHINFO_DEPR, depr表示 网页路径"分隔符",用"-", 有利于seo,注意是从 sername/index.php(开始的)/home-user-login-var-value开始的,pathinfo也支持普通的参数传值(仅仅支持参数...). 在thinkphp中,有两个地方使用depr,另一个就是tpl的文件目录组织分…

SQL中的多表查询,以及JOIN的顺序重要么?

说法是&#xff0c;一般来说&#xff0c;JOIN的顺序不重要&#xff0c;除非你要自己定制driving table。 示例&#xff1a; SELECT a.account_id, c.fed_id, e.fname, e.lname-> FROM account AS a INNER JOIN customer AS c-> ON a.cust_id c.cust_id-> INNER JOIN …

字节跳动 设计模式 pdf_凭这份pdf我拿下了美团、字节跳动、阿里、小米等大厂的offer...

关于程序员&#xff0c;除了做项目来提高自身的技术之外&#xff0c;还有一种提升自己的专业技能就是&#xff1a;多&#xff01;看&#xff01;书&#xff01;小编整理出一篇Java进阶架构师之路的核心知识&#xff0c;同时也是面试时面试官必问的知识点&#xff0c;篇章也是包…

android 音频播放总结 soundlPool,MediaPlay

soundlPool 用于小音频的播放多个同时播放。 使用步骤&#xff1a; 步骤一&#xff1a; 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下&#xff0c;区别在于assets下可以再新建文件夹而raw不行&#xff0c;assets内部单个文件超过1m时可能存在bug而raw不会…

文本分析软件_十大针对机器学习的文本注释工具与服务,你选哪个?

房地产和键【51CTO.com快译】目前&#xff0c;从搜索引擎与情感分析&#xff0c;到虚拟助手与聊天机器人&#xff0c;机器学习应用场景中的许多研究领域&#xff0c;都需要通过文本注释工具与服务来提供准确性。在AI研究与开发行业中&#xff0c;发现或创建可注释的数据对于项目…