当前位置: 首页 > news >正文

Java多线程实现的四种方式_多线程实现的四种方式

实现多线程有以下四种方式:

1. 继承Thread类

2.实现Runnable接口

3.实现Callable接口

4.线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。

体系结构:

java.util.concurrent.Executor : 负责线程的使用与调度的根接口

|--ExecutorService 子接口: 线程池的主要接口

|--ThreadPoolExecutor 线程池的实现类

|--ScheduledExecutorService 子接口:负责线程的调度

|--ScheduledThreadPoolExecutor :继承 ThreadPoolExecutor, 实现 ScheduledExecutorService *

工具类 : Executors

ExecutorService newFixedThreadPool() : 创建固定大小的线程池

ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。

ExecutorService newSingleThreadExecutor() : 创建单个线程池。线程池中只有一个线程

ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程,可以延迟或定时的执行任务。

1) 继承Thread类package com.lxj.juc;

public class TestThread {

public static void main(String[] args) {

ThreadDemo threadDemo = new ThreadDemo();

threadDemo.start();

}

}

class  ThreadDemo extends Thread{

@Override

public void run() {

boolean flag = false;

for(int i  = 3 ; i 

flag = false;

for(int j = 2; j <= Math.sqrt(i) ; j++) {

if(i % j == 0) {

flag = true;

break;

}

}

if(flag == false) {

System.out.print(i+"  ");

}

}

}

}

运行结果:

3  5  7  11  13  17  19  23  29  31  37  41  43  47  53  59  61  67  71  73  79  83  89  97

2)实现Runnable接口package com.lxj.juc;

public class TestRunnable {

public static void main(String[] args) {

RunnableDemo runnableDemo = new RunnableDemo();

new Thread(runnableDemo).start();

}

}

class RunnableDemo implements Runnable{

@Override

public void run() {

boolean flag = false;

for(int i  = 3 ; i 

flag = false;

for(int j = 2; j <= Math.sqrt(i) ; j++) {

if(i % j == 0) {

flag = true;

break;

}

}

if(flag == false) {

System.out.print(i+"  ");

}

}

}

}

运行结果:

3  5  7  11  13  17  19  23  29  31  37  41  43  47  53  59  61  67  71  73  79  83  89  97

3)实现Callable接口package com.lxj.juc;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.Executors;

import java.util.concurrent.FutureTask;

public class TestCallable1 {

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

CallableDemo callableDemo = new CallableDemo();

FutureTask futureTask = new FutureTask<>(callableDemo);

new Thread(futureTask).start();

List lists = (List)futureTask.get(); //获取返回值

for (Integer integer : lists) {

System.out.print(integer + "  ");

}

}

}

class CallableDemo implements Callable>{

@Override

public List call() throws Exception {

boolean flag = false;

List lists = new ArrayList<>();

for(int i  = 3 ; i 

flag = false;

for(int j = 2; j <= Math.sqrt(i) ; j++) {

if(i % j == 0) {

flag = true;

break;

}

}

if(flag == false) {

lists.add(i);

}

}

return lists;

}

}

运行结果:

3  5  7  11  13  17  19  23  29  31  37  41  43  47  53  59  61  67  71  73  79  83  89  97

4) 线程池package com.lxj.juc;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

public class TestThreadPool {

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

ExecutorService executorService = Executors.newFixedThreadPool(5);

List>> ints = new ArrayList<>();

for(int i = 0 ; i 

Future> future = executorService.submit(new Callable>() {

@Override

public List call() throws Exception {

boolean flag = false;

System.out.println(Thread.currentThread().getName()+"  ");

List lists = new ArrayList<>();

for(int i  = 3 ; i 

flag = false;

for(int j = 2; j <= Math.sqrt(i) ; j++) {

if(i % j == 0) {

flag = true;

break;

}

}

if(flag == false) {

lists.add(i);

}

}

return lists;

}

});

ints.add(future);

}

for (Future> future : ints) {

System.out.println(future.get());

}

}

}

class ThreadPoolDemo {

}

运行结果:

pool-1-thread-2

pool-1-thread-5

pool-1-thread-3

pool-1-thread-1

pool-1-thread-4

[3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

[3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

[3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

[3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

[3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

以上即为创建多线程的4种方式。

相关文章:

  • plot python 修改属性_详解Matplotlib绘图之属性设置
  • ajax传值 vue_vue2.0 axios post请求传参问题(ajax请求)
  • ant构建 java标签用法_Ant构建
  • java readshort_short readShort
  • php读取文本写入数据库,PHP读取TXT文件写入数据库
  • 游戏抽奖网站用java怎么做,Java实现游戏抽奖算法
  • 重载与过载 php,PHP中的重载与接口
  • matlab upcoef,matlab 的一些常识
  • mysql的select语句6,MySQL数据库中的六条比较有用的SQL语句 | 很文博客
  • php反序列化 R,PHP反序列化
  • 网络约束matlab程序,matlab 里 编写 外点法约束优化问题程序  修改程序
  • matlab中方差分析的自由度,多因素方差分析的自由度
  • matlab利用液晶屏输出图片,用matlab转换图片为C代码,实现液晶屏显示
  • matlab弹幕抓取,B站某视频弹幕抓取
  • php in条件,PHP-使用“ in”条件检索repeatin结果
  • docker python 配置
  • Python3爬取英雄联盟英雄皮肤大图
  • Redis在Web项目中的应用与实践
  • 对JS继承的一点思考
  • 计算机在识别图像时“看到”了什么?
  • 坑!为什么View.startAnimation不起作用?
  • 离散点最小(凸)包围边界查找
  • 聊一聊前端的监控
  • AI算硅基生命吗,为什么?
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #define、const、typedef的差别
  • #includecmath
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Python第六天)文件处理
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (数据结构)顺序表的定义
  • (一)80c52学习之旅-起始篇
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 读取 JSON格式的数据
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • @Transactional 竟也能解决分布式事务?
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [20190401]关于semtimedop函数调用.txt
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)