java 创建线程的四种方式
作者:(•̀ω•́)y 发布时间:2023-11-02 21:38:07
标签:java,创建,线程
1、继承Thread类方式
这种方式适用于执行特定任务,并且需要获取处理后的数据的场景。
举例:一个用于累加数组内数据的和的线程。
public class AdditionThread extends Thread {
private int sum = 0;
private int[] nums;
public AdditionThread(int[] nums, String threadName) {
super(threadName);
this.nums = nums;
}
@Override
public void run() {
for (int num : nums) {
sum += num;
}
}
public int getSum() {
return sum;
}
}
调用方式:
public class Main {
public static void main(String[] args) throws InterruptedException {
int[] nums = {10, 12, 15, 200, 100};
AdditionThread thread = new AdditionThread(nums, "AdditionThread");
thread.start();
thread.join();
System.out.println("sum=" + thread.getSum());
}
}
2、Runnable 接口方式
定义一个实现Runnable接口的类,或者直接创建一个匿名内部类,并覆盖 run() 方法。最后作为参数传给Thread的构造函数。
public class Main {
public static void main(String[] args) {
// 自定义的 Runnable
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable, "Runnable-Thread");
thread.start();
// 自定义匿名内部类
new Thread(() -> {
System.out.println("Inner class");
}).start();
}
static class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("MyRunnable");
}
}
}
3、 Callable 接口方式
Callable 接口与 Runnable 接口的区别:
(1)Callable 的方法为call(),Runnable的方法为run()。
(2)Callable 的方法由返回值,Runnable 没有。
(3)Callable 的方法声明的Exception,Runnable的没有。
public class Main {
public static void main(String[] args) {
MyCallable myCallable = new MyCallable();
FutureTask<String> task = new FutureTask<>(myCallable);
Thread thread = new Thread(task, "FutureTask");
thread.start();
try {
// 通过get方法获取返回值
String result = task.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
static class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
// 模拟超时操作
Thread.sleep(1000);
return "OK";
}
}
}
4、线程池方式
我们可以通过 ThreadPoolExecutor 类的构造函数来创建线程池,也可以通过Executors工厂方法来创建,如
// 创建固定线程数的线程池
Executors.newFixedThreadPool();
// 创建只有一个核心线程的线程池
Executors.newSingleThreadExecutor();
// 创建一个没有核心线程,但可以缓存线程的线程池
Executors.newCachedThreadPool();
// 创建一个适用于执行定时任务的线程池
Executors.newScheduledThreadPool();
在创建线程池时,最好传入 ThreadFactory 参数,指定线程池所创建线程的名称。这样有利于分析定位可能存在的问题。
public class Main {
private static final ExecutorService SERVICE =
Executors.newFixedThreadPool(5, new BasicThreadFactory("My-Thread"));
public static void main(String[] args) {
// 打印线程的名字
System.out.println("main thread name:" + Thread.currentThread().getName());
SERVICE.execute(() -> {
System.out.println("Hello thread pool.");
// 打印线程池里的线程的名字
System.out.println("thread name:" + Thread.currentThread().getName());
});
}
static class BasicThreadFactory implements ThreadFactory {
private final AtomicInteger threadNumber = new AtomicInteger(0);
private final String basicName;
public BasicThreadFactory(String basicName) {
this.basicName = basicName;
}
@Override
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable);
String name = this.basicName + "-" + threadNumber.incrementAndGet();
thread.setName(name);
return thread;
}
}
}
来源:https://www.cnblogs.com/laishenghao/p/13965258.html?utm_source=tuicool&utm_medium=referral


猜你喜欢
- 1.通过用FTP进行上传文件,首先要实现建立FTP连接,一般建立FTP连接,需要知道FTP配置有关的信息。一般要在Bean中建立一个Serv
- DataTableDataTable 是 C# 中常用的一种数据表格类型,它类似于数据库中的表格,可以用来存储和处理数据。DataTable
- 在 Java 中,null 是一个表示“空值”的特殊值。相信大家都很了解 null 在 Java 中
- 如何使用 Jetpack Compose 创建翻转卡片效果介绍在电子商务和银行应用程序中输入卡信息是很常见的情况。我认为让用户更轻松地处理这
- 目录1.系统需求分析1.1 系统功能及框图该项目实现了备忘录的创建,修改,删除,查询,对备忘录数目的统计和软件的说明。1.2 系统需求功能&
- 本文实例为大家分享了抢红包源码,供大家参考,具体内容如下1. 正确获取红包流程2. 软件介绍2.1 效果图:2.2 功能介绍2.2.1 账号
- 前言笔者因为项目需要自定义相机,所以了解了一下 Android 关于 camera 这块的 API。Android SDK 21(LOLLI
- 代码入下:import java.io.*; public class Practice { publ
- 导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下。所用技术就是SpringBoot,然后是MVC架
- using System;using System.Collections.Generic;using System.IO;using Sy
- LiveData简介在日常安卓开发中,一些耗时的 * 如列网络请求,数据库读写都不能在主线程执行,必须开一条子线程去执行这些耗时操作,但我们往
- 具体可见http://developer.android.com/tools/debugging/ddms.html。 DDMS为IDE和e
- 前言我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常,还有一些是代码书写不规范造成的异常例如:NullPo
- WebView 网页滚动截屏,可对整个网页进行截屏而不是仅当前屏幕哦! 注意若Web页面存在position:fixed; 的话得在调用前设
- 简介现在市面上的apk只要涉及用户中心都会有头像,而且这个头像也是可自定义的,有的会采取读取相册选择其中一张作为需求照片,另一种就是调用系统
- 前言水波纹特效,想必大家或多或少见过,在我的印象中,大致有如下几种: 支付宝 "咻
- 1.实现方式说明本文在---- 手写redis @ Cacheable注解支持过期时间设置 的基础之上进行扩展。1.1问题说明
- 前述园子里有许多人对log4net这款开源的日志记录控件有很多介绍。在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少
- 本文介绍了ListView给每个Item上面的按钮添加事件,具体如下:1.先看下效果图:在这里仅供测试,我把数据都写死了,根据需要可以自己进
- 本文实例讲述了C#简单读取、改变文件的创建、修改及访问时间的方法。分享给大家供大家参考。具体如下:FileInfo fi = new Fil