程序员:java中直接或间接创建线程的方法总结

在java开发中,经常会涉及多线程的编码,那么通过直接或间接创建线程的方法有哪些?现整理如下:

1、继承Thread类,重写run()方法

class Worker extends Thread {

@Override

public void run() {

System.out.println("Code run in a sub thread!");

}

}

public class CreateThreadTester {

public static void main(String[] args) throws InterruptedException {

Thread t = new Worker();

t.start();

t.join();

}

}

2、实现Runnable接口,重写run()

class Worker implements Runnable {

@Override

public void run() {

System.out.println("Code run in a sub thread!");

}

}

public class CreateThreadTester {

public static void main(String[] args) throws InterruptedException {

Runnable task = new Worker();

Thread t = new Thread(task);

t.start();

t.join();

}

}

3、实现Callable接口,重写call()

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.FutureTask;

class Worker implements Callable<Integer> {

@Override

public Integer call() {

System.out.println("Code run in a sub thread!");

return Integer.valueOf(10);

}

}

public class CreateThreadTester {

public static void main(String[] args) throws InterruptedException, ExecutionException {

Callable<Integer> thread = new Worker();

FutureTask<Integer> task = new FutureTask<Integer>(thread);

Thread t = new Thread(task);

t.start();

System.out.println("Thread return value:" + task.get());

}

}

4、使用定时器

(1)基于类java.util.Timer和重写TimerTask的run()执行定时任务

示例代码如下:

import java.util.Timer;

import java.util.TimerTask;

class Worker extends TimerTask {

@Override

public void run() {

System.out.println("Code run in a sub thread!");

}

}

public class CreateThreadTester {

public static void main(String[] args) {

Timer timer = new Timer();

TimerTask task = new Worker();

timer.schedule(task, 0);

}

}

(2) 基于java.util.concurrent.Executors.newSingleThreadScheduledExecutor()执行定时任务

示例代码如下:

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class ThreadScheduledExecutorTester01 {

private static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() {

public SimpleDateFormat initialValue() {

return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

}

};

public static void main(String[] args) {

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

service.schedule(new Runnable() {

@Override

public void run() {

System.out.println(dateFormat.get().format(new Date()) + " -- 11111111111111");

}

}, 2, TimeUnit.SECONDS);

service.schedule(new Runnable() {

@Override

public void run() {

System.out.println(dateFormat.get().format(new Date()) + " -- 22222222222222222222");

}

}, 2, TimeUnit.SECONDS);

service.scheduleAtFixedRate(new Runnable() {

@Override

public void run() {

System.out.println(dateFormat.get().format(new Date()) + " -- 3333333333333333333333");

}

}, 1, 5, TimeUnit.SECONDS);

}

}

5、使用java.util.concurrent.Executors工厂类

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

class Worker implements Runnable {

@Override

public void run() {

System.out.println("Code run in a sub thread!");

}

}

public class CreateThreadTester {

public static void main(String[] args) {

ExecutorService service = Executors.newSingleThreadExecutor();

Runnable command = new Worker();

service.execute(command);

}

}

Executors 的工具类可以创建三种类型的普通线程池:

固定大小的线程池:Executors.newFixedThreadPool(n)

单线程池:Executors.newSingleThreadExecutor()

缓存线程池:Executors.newCachedThreadPool()

当提交任务速度高于线程池中任务处理速度时,缓存线程池会不断的创建线程。 适用于提交短期的异步小程序,以及负载较轻的服务器,而负载相对较重的服务器应使用固定大小的线程池。

6、Spring中使用@EnableAsync和@Async注解

在pom.xml文件中配置spring-boot-starter依赖:

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter</artifactId>

<version>2.2.1.RELEASE</version>

</dependency>

示例代码如下:

import java.util.concurrent.Executor;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.support.AbstractApplicationContext;

import org.springframework.scheduling.annotation.Async;

import org.springframework.scheduling.annotation.AsyncConfigurer;

import org.springframework.scheduling.annotation.EnableAsync;

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import org.springframework.stereotype.Service;

@Service

class AsyncService {

@Async

public void testAsync_1() {

System.out.println("testAsync_1 is running, thread :" + Thread.currentThread().getName());

}

@Async

public void testAsync_2() {

System.out.println("testAsync_2 is running, thread :" + Thread.currentThread().getName());

}

}

@Configuration

@ComponentScan("com.tang.spring")

@EnableAsync

class Config implements AsyncConfigurer {

public Executor getAsyncExecutor() {

ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();

taskExecutor.setCorePoolSize(2);

taskExecutor.setMaxPoolSize(2);

taskExecutor.setQueueCapacity(2);

taskExecutor.initialize();

return taskExecutor;

}

}

public class SpringApplicationTester {

public static void main(String[] args) {

AbstractApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

AsyncService bean = context.getBean(AsyncService.class);

bean.testAsync_1();

bean.testAsync_2();

}

}

今天就先介绍到这里,后面继续整理,持续更新。。。

来源:产品经理

原文地址:https://www.cnblogs.com/1994july/p/12324640.html

时间: 2024-08-28 03:59:48

程序员:java中直接或间接创建线程的方法总结的相关文章

黑马程序员-java中的反射总结

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java 反射总结 类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM 内部表示对象的组件.在Java 中, 类装载器把一个类装入JVM 中,要经过以下步骤: 1.装载:查找和导入Class 文件: 通过一个类的全限定名来获

黑马程序员——Java中的面向对象

----android培训.java培训.期待与您交流! ---- 通过一段时间的学习,对于面向对象有了更深刻的了解,面向对象是将复杂的事情简单化,面向对象的思想更能全面详细的想到问题的关键,下面是对面向对象的一些总结: 面向对象:将功能封装进对象,强调具备了功能的对象 特点: 1:将复杂的事情简单化.                2:面向对象将以前的过程中的执行者,变成了指挥者.                3:面向对象这种思想是符合现在人们思考习惯的一种思想. 面向过程是执行者   , 

黑马程序员------Java中多线程学习总结(一)

Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! 一.多线程的概念 进程:是一种“自包容”的运行程序,有自己的地址空间. 基于进程的特点是允许计算机同时运行两个或更多的程序 线程:是进程内部单一的一个顺序控制流 . 基于线程的多任务处理环境中,线程是最小的处理单位. 在Java中,一个应用程序可以包含多个线程.每个线程执行特定的任务,并可与其他线程并发执行.多线程使系统的空转时间减少,提高了CPU的利用率.多线程编程隐藏了CPU在任务之间切换的事实. 二.创建

黑马程序员------Java中jdk1.5新特性

Java培训.Android培训.iOS培训..Net培训.期待与您交流! JDK1.5新特性: 为什么会出现新特性: 新的技术出现是为了解决老的问题,Java语言为了提高开发者的开发效率,对之前的某些不利于提高效率的技术进行改进. 静态导入: 静态导入:可以导入某个类下的静态方法,静态导入后,可以不写类名而直接使用此类下的静态方法. 语法:import static 包名.类名.静态方法 代码示例: package com.itheima.day1; /** * 静态导入 * @author

黑马程序员————java中的网络编程

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- java中的网络编程 一.网络编程概述:基于互联网的编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换. 二.网络模型:OSI和TCP/IP 1.OSI(Open System Interconnection开放系统互连

黑马程序员------Java中GUI(图形用户界面)学习总结

Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! GUI: Graphical User Interface(图形用户接口). 即用图形的方式,来显示计算机操作的界面,以方便用户更容易更直观地操作. Java中为GUI提供的对象都在Java.Awt和Javax.Swing两个包中. java.Awt: Abstract Window ToolKit (抽象窗口工具包). 需要调用本地系统方法实现功能,属于重量级控件. javax.Swing: 在AWT的基础上

黑马程序员————java中的抽象类

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 抽象类集中的体现了java面向对象的特性,对于每一种事物通过五个方面:属性,方法,构造器,代码块,内部类,来重新解构再进行组装,然后将类似的事物归为一类,这是面向对象的思想.java中常说万物皆对象,那么很显然我们可以进一步的将其中的方法

黑马程序员-Java中的基本数据类型

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java中的数据类型分为两个大类:基本数据类型和引用数据类型. 其中基本数据类型又可以分为四类:整型数据类型,小数数据类型,字符类型,布尔型. 整型数据类型还分为:byte,short,int(整型),long(长整型).默认为int型.

黑马程序员-java中方法的知识点和递归调用

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 方法执行原理:(方法不调用不执行,调用才执行)  *   方法在调用的这时候,才会在内存中划分空间  *   方法在调用的时候,是在栈内存中分配的空间(jvm有一块内存是栈内存) * 函数/方法目的: 还是为了代码重用  * 相同的类型的