创建多线程的4种方式
时间:2022-07-23
本文章向大家介绍创建多线程的4种方式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 继承Thread
继承Thread类,重写run方法实现多线程
package com.noneplus;
class Task1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Task1输出:" + i);
}
}
}
class Task2 extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(" Task2输出:" + i);
}
}
}
/**
* @Description: 继承Thread,重写run方法,实现多线程
* @Author noneplus
* @Date 2020/8/3 17:34
*/
public class ExtendThread {
public static void main(String[] args) {
Task1 task1 = new Task1();
task1.start();
Task2 task2 = new Task2();
task2.start();
for (int i = 0; i < 10; i++) {
System.out.println(" mainTask输出:" + i);
}
//3个线程的执行顺序由CPU的线程调度决定
}
}
- 实现Runnable接口
Runnable接口解决了单继承的问题
package com.noneplus;
class Task3 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Task1输出:" + i);
}
}
}
class Task4 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(" Task2输出:" + i);
}
}
}
/**
* @Description: 实现Runnable接口,实现多线程,弥补单继承的问题
* @Author noneplus
* @Date 2020/8/3 17:34
*/
public class ImplementRunnable {
public static void main(String[] args) {
Task3 runnable3 = new Task3();
Task4 runnable4 = new Task4();
Thread task3 = new Thread(runnable3);
Thread task4 = new Thread(runnable4);
task3.start();
task4.start();
for (int i = 0; i < 10; i++) {
System.out.println(" " +
" mainTask输出:" + i);
}
//3个线程的执行顺序由CPU的线程调度决定
}
}
- 实现Callable接口
Callable支持返回值(但用多线程加返回值有点奇怪)
package com.noneplus;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
class Task5 implements Callable {
@Override
public Integer call() throws Exception {
Integer i = 0;
for (; i < 10; i++) {
System.out.println("Task5输出:" + i);
}
return i;
}
}
class Task6 implements Callable {
@Override
public Integer call() throws Exception {
Integer i = 0;
for (; i < 10; i++) {
System.out.println(" Task6输出:" + i);
}
return i;
}
}
/**
* @Description: 实现Callable接口,可以定义返回值
* @Author noneplus
* @Date 2020/8/3 17:53
*/
public class ImplementCallable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
for (int i = 0; i < 10; i++) {
System.out.println(" mainTask输出:" + i);
}
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Task5());
FutureTask<Integer> futureTask1 = new FutureTask<Integer>(new Task6());
Thread thread = new Thread(futureTask);
Thread thread1 = new Thread(futureTask1);
thread.start();
thread1.start();
System.out.println("任务返回结果:"+futureTask.get());
System.out.println("任务返回结果:"+futureTask1.get());
}
}
- 使用线程池ThreadPoolExecutor
package com.noneplus;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
class Task7 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Task7输出:" + i + "当前线程" + Thread.currentThread().getName());
}
}
}
class Task8 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Task8输出:" + i + "当前线程" + Thread.currentThread().getName());
}
}
}
/**
* @Description: 使用线程池创建线程池,实现线程复用和管理
* @Author noneplus
* @Date 2020/8/5 15:38
*/
public class ThreadPool {
public static void main(String[] args) {
/**
* 阿里推荐:ThreadPoolExecutor
* ```
* public ThreadPoolExecutor(int corePoolSize,
* int maximumPoolSize,
* long keepAliveTime,
* TimeUnit unit,
* BlockingQueue<Runnable> workQueue)
* ```
* 1、corePoolSize 核心线程数大小,当线程数 < corePoolSize ,会创建线程执行 runnable
*
* 2、maximumPoolSize 最大线程数, 当线程数 >= corePoolSize的时候,会把 runnable 放入 workQueue中
*
* 3、keepAliveTime 保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。
*
* 4、unit 时间单位
*
* 5、workQueue 保存任务的阻塞队列
*
* 6、threadFactory 创建线程的工厂
*
* 7、handler 拒绝策略
*
*/
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3));
for (int i=0;i<10;i++)
{
threadPoolExecutor.execute(new Task7());
threadPoolExecutor.execute(new Task8());
}
}
}
- Silverlight:Mouse Avoiding 躲避鼠标效果
- CTreeCtrl 控件使用总结
- 在ASP.NET MVC 4中使用Kendo UI Grid
- 每周四更面试题:True+True=?
- iis7 发布mvc 遇到的HTTP错误 403.14-Forbidden Web 服务器被配置为不列出此目录的内容
- NET中验证控件表达式汇总
- 动态执行超过4000个字符的SQL
- 在ASPNET中使用JS集锦
- 小程序又又又……
- js中页面刷新和页面跳转的方法总结
- PixelBender(着色器)初体验
- Centos下堡垒机Jumpserver V3.0环境部署完整记录(1)-安装篇
- CSS好看的按钮
- Metaball(元球)效果学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springboot 自动配置和拦截器相关
- Hive函数
- java创建本地缓存模拟redis缓存操作
- Python学习笔记(一)
- Python学习笔记(三)
- 文件下载,excel导出
- Flutter基础widgets教程-CupertinoButton篇
- 几款好用的开源工具类
- Linux部署之Docker方式部署项目
- Flutter基础widgets教程-CupertinoFullscreenDialogTransition篇
- mapper.xml相关语法
- Flutter基础widgets教程-CupertinoNavigationBar篇
- Hive排序函数
- Flutter基础widgets教程-CupertinoPageScaffold篇
- 前后端分离开发跨域问题