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

Posted 1994july

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员: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();

}

 

}

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

 

技术图片
来源:产品经理

以上是关于程序员:java中直接或间接创建线程的方法总结的主要内容,如果未能解决你的问题,请参考以下文章

Java 并发编程笔记 - 创建线程的 ?种方法

20165219 2017-2018-2 《Java程序设计》第8周学习总结

Java程序员必备!Java底层分析多线程行为附答案

3.8 java基础总结①多线程

20165225《Java程序设计》第八周学习总结

(转)Java线程Java内存模型总结