首页 > 编程语言 >java 多线程简单实现

java 多线程简单实现

时间:2024-07-31 17:26:21浏览次数:11  
标签:Runnable run Thread new MyThread 线程 简单 java 多线程

Java 实现多线程的方式

在 java 中实现多线程有四种方式,如下:
1、继承 Thread 类
2、实现 Runnable 接口
3、使用 FutureTask
4、使用 Executor 框架

2、继承 Thread 类

Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。 启动线程的唯一方法就是通过 Thread 类的 start () 实例方法。 start () 方法是一个 native 方法,它将启动一个新线程,并执行 run () 方法。

public class MyThread extends Thread {
	public void run() {
		System.out.println("MyThread.run()");
	}
}
MyThread myThread = new MyThread();
myThread.start();

2、实现 Runnable 接口

如果一个类已经 extends 另一个类,就无法直接 extends Thread,此时,可以实现一个 Runnable 接口。

public class MyThread implements Runnable {
	public void run() {
		System.out.println("MyThread.run()");
	}
}

启动 MyThread,需要首先实例化一个 Thread,并传入自己的 MyThread 实例:

MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();

事实上,当传入一个 Runnable target 参数给 Thread 后, Thread 的 run () 方法就会调用 target.run (),如下:

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

3、ExecutorService、 Callable、Future 有返回值线程

有返回值的任务必须实现 Callable 接口,类似的,无返回值的任务必须 Runnable 接口。执行 Callable 任务后,可以获取一个 Future 的对象,在该对象上调用 get 就可以获取到 Callable 任务返回的 Object 了,再结合线程池接口 ExecutorService 就可以实现传说中有返回结果的多线程了。

//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(taskSize);
// 创建多个有返回值的任务
List<Future> list = new ArrayList<Future>();
for (int i = 0; i < taskSize; i++) {
Callable c = new MyCallable(i + " ");
// 执行任务并获取 Future 对象
Future f = pool.submit(c);
	list.add(f);
}
// 关闭线程池
pool.shutdown();
// 获取所有并发任务的运行结果
for (Future f : list) {
// 从 Future 对象上获取任务的返回值,并输出到控制台
	System.out.println("res: " + f.get().toString());
}

4、基于线程池的方式

线程和数据库连接这些资源都是非常宝贵的资源。那么每次需要的时候创建,不需要的时候销毁,是非常浪费资源的。那么我们就可以使用缓存的策略,也就是使用线程池。

// 创建线程池
ExecutorService threadPool = Executors.newFixedThreadPool(10);
while(true) {
	threadPool.execute(new Runnable() { // 提交多个线程任务,并执行
		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName() + " is running ...");
			try {
				Thread.sleep(3000L);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	});
}

谢谢支持~

标签:Runnable,run,Thread,new,MyThread,线程,简单,java,多线程
From: https://blog.csdn.net/qq_28419035/article/details/140823016

相关文章

  • 设计模式 - 简单工厂模式(Simple Factory Pattern)
    设计模式-简单工厂模式(SimpleFactoryPattern)  概要  记忆关键字:工厂类创建对象  定义:通过工厂类创建对象,并且根据传入参数决定具体子类对象的做法,就是简单工厂模式  分析:如果一个类的实例需要在许多地方被创建和初始化,而初始化的代码也比较复杂。此时可以考虑......
  • 用Python打造精彩动画与视频,3.3 添加音频和简单效果
     3.3添加音频和简单效果在本节中,我们将学习如何使用MoviePy库为视频添加音频和一些简单的效果。这些操作可以让你的视频更具吸引力和个性化。准备工作首先,确保你已经安装了MoviePy和pydub库。你可以通过以下命令安装:pipinstallmoviepypydub同时,你需要确保系统......
  • Java URL映射
    问题描述URL映射是诸如Django、RubyonRails等网页框架(webframeworks)的一个重要组件。对于从浏览器发来的HTTP请求,URL映射模块会解析请求中的URL地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的URL映射功能。本题中URL映射功能的配置由......
  • Java的杂七杂八(未完成)
    java特点1、面向对象性:两大要素:类、对象三大特征:封装、继承、多态2、健壮性:去除了c/c++的指针;添加了垃圾回收机制--->但Java依旧可能出现内存的溢出和泄漏3、跨平台性:writeonce,runanywhere“一次编译,到处运行”-->JVM不同的操作系统需要安装不同的JV......
  • C#银行卡ocr识别接口的简单集成方式
    银行卡识别接口是指:以文字识别技术为基础衍生的银行卡卡面信息识别接口,该接口可以快速、精准的将银行卡卡面上包含银行卡号、卡类型、银行名称等文字信息提取成功,以帮助需要支付的平台进行银行卡身份的快速核验。企业又该如何快速的对银行卡识别接口进行集成?可以选择翔云......
  • Java 方法
    方法一、语句定义格式修饰符返回值类型方法名(参数类型1参数名1,参数类型2参数名2,...){方法的实现逻辑;return返回值;}名词解释修饰符:目前的固定写法publicstatic2hgwaghgwdh7yygxsafe方法名:将来调用者使用功能的名字,可以通过名字调用,方法名要符合标识符的命名规......
  • Java面向对象
    Java面向对象(OOP)学习面向对象的三条主线1、Java中类及类的成员2、面向对象的三大特征3、其他关键字的使用Java中类及类的成员1、成员变量(或属性)2、方法(函数)3、构造器(或构造方法)4、代码块(或初始化块)5、内部类面向对象的三大特征封装性、继承性、多态性(+抽象性)其他关......
  • 计算机Java项目|基于SpringBoot的科研工作量管理系统
    作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业......
  • 中国人做成非洲之王:这个宁波人不简单
    提起传音你可能有点陌生,但是这个“陌生”的手机品牌占据了非洲40%的智能机市场,是全球出货量第四的手机品牌。仅在2023年的全球出货量就约为1.94亿部。而它的幕后老板,是一个土生土长的中国宁波人。 一  传音手机的创始人是竺兆江,他出生于1973年,毕业于南昌航空大......
  • 在Python中将简单的字典导出到Excel文件中
    我是Python新手。我有一个简单的字典,其键和值如下dict1={"numberofstoragearrays":45,"numberofports":2390,......}我需要将它们放入Excel表中,如下numberofstoragearrays45numberofports2390我有一个非常大的字典。importpandasasp......