【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;
}
}
}
【Java】线程的创建方式的更多相关文章
- Java线程的创建方式三:Callable(四)
一.Java实现多线程的三种方式 方式一:继承Thread类: public class Test extends Thread { public static void main(String[] ...
- Java多线程——线程的创建方式
Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...
- Java线程:创建与启动
Java线程:创建与启动 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 R ...
- 漫谈并发编程(二):java线程的创建与基本控制
java线程的创建 定义任务 在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...
- JAVA - 线程从创建到死亡的几种状态都有哪些?
JAVA - 线程从创建到死亡的几种状态都有哪些? 新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 sta ...
- Java并发编程(01):线程的创建方式,状态周期管理
本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...
- Java 线程的创建和启动
Java 使用 Thread 类代表线程,所有的线程对象都必须是 Thread 类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码). Java 使用线程执 ...
- Java之多线程创建方式
多线程的由来 我们在之前,学习的程序在没有跳转语句的前提下,都是由上至下依次执行,那现在想要设计一个程序,边打游戏边听歌,怎么设计?要解决上述问题,咱们得使用多进程或者多线程来解决. 多线程的好处: ...
- Java线程之创建线程
翻译自:https://www.journaldev.com/1016/java-thread-example 进程 进程是一个自包含的执行环境,它可以被看成一个程序或应用程序.然而一个应用程序本身包 ...
- 【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法
1.线程的创建与运行 (1).继承或直接使用Thread类 继承Thread类创建线程: /** * 主类 */ public class ThreadTest { public static voi ...
随机推荐
- Windows 编程基础
1 Windows应用程序的分类 1.1 控制台程序 DOS程序,本身没有窗口,通过WINDOWS下的DOS窗口执行. 1.2 窗口程序 拥有自己的窗口,通过窗口可以和用户进行交互.(比如:记事本,画 ...
- python接口测试之读取配置文件
1.python使用自带的configparser模块用来读取配置文件,配置文件可以为.conf或.ini结尾 在使用前需要先安装该模块,使用pip安装即可 2.新建一个名为a.conf的配置文件 a ...
- CentOS 7系统常见快捷键操作方式
快捷键操作方式 Linux系统中一些常见的快捷方式,可有效提高操作效率,在某些时刻也能避免操作失误带来的问题. 最有用的快捷键 序号 快捷键 官方说明 掌握程度 01 Tab 命令或路径等的补全键 移 ...
- 【不知道怎么分类】CF 819B Mister B and PR Shifts
题目内容 洛谷链接 定义一个全排列\(p_i\)的偏移值为\(\sum_{i=1}^{n}|p[i]-i|\). 给你一个全排列,你可以从后面拿\(k\in[0,n-1]\)个数放在前面,使得该全排列 ...
- npoi 设置单元格格式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- go mod模式,引入自己的包,goland飘红
- Gitlab 11.9.1 高可用教程
Gitlab 11.9.1 高可用教程 一. PostgreSQL数据迁移 由于默认Gitlab的安装会内置Postgres数据库,并且没有对外,所以我们需要通过设置对应的Gitlab的配置将其中的数 ...
- ssm整合所用全部依赖pom.xml(idea版)
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...
- 拿了十几个offer,怎样做选择?
本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 最近收到好几个读者的咨询,关于如何选offer的 ...
- Excel基础—为什么学习Excel
吾生也有涯,而知也无涯 点赞再看,养成习惯 自从个人计算机开始普及以后,Excel就得到了广泛的传播,工作学习生活中不处不存在Excel的影子,不论是考勤,工资还是其他的统计等等,都离不开Excel. ...