在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();

}

}

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

来源:产品经理

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

  1. 【Java 线程的深入研究1】Java 提供了三种创建线程的方法

    Java 提供了三种创建线程的方法: 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 1.通过实现 Runnable 接口来 ...

  2. 黑马程序员——JAVA基础之抽象和接口 , 模版方法设计模式

    ------- android培训.java培训.期待与您交流! ---------- 抽象定义:           抽象就是从多个事物中将共性的,本质的内容抽取出来.           例如:狼 ...

  3. 线程 学习教程(一): Java中终止(销毁)线程的方法

    结束线程有以下三种方法:(1)设置退出标志,使线程正常退出,也就是当run()方法完成后线程终止 (2)使用interrupt()方法中断线程 (3)使用stop方法强行终止线程(不推荐使用,Thre ...

  4. 五年.net程序员Java学习之路

    大学毕业后笔者进入一家外企,做企业CRM系统开发,那时候开发效率最高的高级程序语言,毫无疑问是C#.恰逢公司也在扩张,招聘了不少.net程序员,笔者作为应届生,也乐呵呵的加入到.net程序员行列中. ...

  5. Java中带包(创建及引用)的类的编译

    Java中带包(创建及引用)的类的编译与调试 java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac **.java即可,当程序中有包声明还能简简单单的直接javac **.jav ...

  6. Java并发编程:如何创建线程?

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  7. java并发编程:如何创建线程

    原文:http://www.cnblogs.com/dolphin0520/p/3913517.html 一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也 ...

  8. Java中Date和Calender类的使用方法

    查看文章     Java中Date和Calender类的使用方法 2009-10-04 20:49 Date和Calendar是Java类库里提供对时间进行处理的类,由于日期在商业逻辑的应用中占据着 ...

  9. 【转】Java并发编程:如何创建线程?

    一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认是java.exe或者javaw.exe(windows下可以通过 ...

随机推荐

  1. python2学习------基础语法3(类、类的继承、类成员函数、防御式编程)

    1.类的定义以及实例化 # 类定义 class p: """ this is a basic class """ basicInfo={&q ...

  2. 使用six库将Python2的项目完全转移到python3

    SIX是用于python2与python3兼容的库. 它存在的目的是为了拥有无需修改即可在Python 2和Python 3上同时工作的代码.话虽这么说,但是这并不代表在Python 3中引用该库就可 ...

  3. 记一次Redis+Getshell经验分享

    前言: 当我们接到一个授权渗透测试的时候,常规漏洞如注入.文件上传等尝试无果后,扫描端口可能会发现意外收获. 知己知彼乃百战不殆,Redis介绍: 简单来说 redis 就是一个Key-Value类型 ...

  4. java随机函数用法Random

     原文地址:http://blog.csdn.net/wpjava/article/details/6004492  import java.util.Random; public class Ran ...

  5. MinGW下编译curl-7.60.0时, 发生ERROR_FILE_NOT_FOUND undeclared

    在编译curl-7.60.0时, 遇到ERROR_FILE_NOT_FOUND undeclared 这个情况, 就没法编译成功!! 下载了以往的版本, 发现是从curl-7.59.0版本开始才有 t ...

  6. html5,css3炫酷实例-元素

    自动完成输入框下拉列表 使用的插件:jquery-ui 使用数据源实现文本框的自动完成功能 <link href="https://cdn.bootcss.com/jqueryui/1 ...

  7. 2、MYSQL 基本数据库命令及约束

    [注]sql语句注意不要忘了后面的   “  : ”,表示结束符 1.如何登陆数据库服务器 C:\Users\zhg>mysql -uroot -p Enter password: ****** ...

  8. leetcode617 Merge Two Binary Trees

    """ Given two binary trees and imagine that when you put one of them to cover the oth ...

  9. Mybatis 学习一

    一.mybatis是什么 mybatis是一个持久层的框架,它可以完全替代JDBC,同时提供接口编程.它访问DAO层是不需要实现类的,只需要一个接口和XML文件(或注解).mybatis让程序将主要精 ...

  10. 使用CORDIC算法求解角度正余弦及Verilog实现

    本文是用于记录在了解和学习CORDIC算法期间的收获,以供日后自己及他人参考:并且附上了使用Verilog实现CORDIC算法求解角度的正弦和余弦的代码.简单的testbench测试代码.以及在Mod ...