Java多线程的三种实现方法

如何用Deep OC-SORT提升多目标跟踪精度?实战配置与性能优化指南 本文是一份针对开发者的Deep OC-SORT多目标跟踪实战指南。详细解析了如何通过部署其核心的“动态外观记忆”与“相机防抖”模块来有效应对遮挡与抖动,从而显著提升跟踪精度与连续性。内容涵盖从环境搭建、参数调优到性能压榨的全流程,并提供针对不同场景的配置建议与工程落地技巧。 阅读详情

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。


1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:

  1. public class MyThread extends Thread {  
  2.   public void run() {  
  3.    System.out.println(”MyThread.run()”);  
  4.   }  
  5. }  
public class MyThread extends Thread {
  public void run() {
   System.out.println("MyThread.run()");
  }
}
在合适的地方启动线程如下:
  1. MyThread myThread1 = new MyThread();  
  2. MyThread myThread2 = new MyThread();  
  3. myThread1.start();  
  4. myThread2.start();  
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();

2、实现Runnable接口方式实现多线程
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
  1. public class MyThread extends OtherClass implements Runnable {  
  2.   public void run() {  
  3.    System.out.println(”MyThread.run()”);  
  4.   }  
  5. }  
public class MyThread extends OtherClass implements Runnable {
  public void run() {
   System.out.println("MyThread.run()");
  }
}
为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:
  1. MyThread myThread = new MyThread();  
  2. Thread thread = new Thread(myThread);  
  3. thread.start();  
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:
  1. public void run() {  
  2.   if (target != null) {  
  3.    target.run();  
  4.   }  
  5. }  
public void run() {
  if (target != null) {
   target.run();
  }
}

3、使用ExecutorService、Callable、Future实现有返回结果的多线程
ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问http://www.javaeye.com/topic/366591 ,这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回值而大费周折了,而且即便实现了也可能漏洞百出。
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5下验证过没问题可以直接使用。代码如下:

  1. import java.util.concurrent.*;  
  2. import java.util.Date;  
  3. import java.util.List;  
  4. import java.util.ArrayList;  
  5.   
  6. /** 
  7. * 有返回值的线程 
  8. */  
  9. @SuppressWarnings(“unchecked”)  
  10. public class Test {  
  11. public static void main(String[] args) throws ExecutionException,  
  12.     InterruptedException {  
  13.    System.out.println(”—-程序开始运行—-“);  
  14.    Date date1 = new Date();  
  15.   
  16.    int taskSize = 5;  
  17.    // 创建一个线程池  
  18.    ExecutorService pool = Executors.newFixedThreadPool(taskSize);  
  19.    // 创建多个有返回值的任务  
  20.    List<Future> list = new ArrayList<Future>();  
  21.    for (int i = 0; i < taskSize; i++) {  
  22.     Callable c = new MyCallable(i + “ ”);  
  23.     // 执行任务并获取Future对象  
  24.     Future f = pool.submit(c);  
  25.     // System.out.println(“>>>” + f.get().toString());  
  26.     list.add(f);  
  27.    }  
  28.    // 关闭线程池  
  29.    pool.shutdown();  
  30.   
  31.    // 获取所有并发任务的运行结果  
  32.    for (Future f : list) {  
  33.     // 从Future对象上获取任务的返回值,并输出到控制台  
  34.     System.out.println(”>>>” + f.get().toString());  
  35.    }  
  36.   
  37.    Date date2 = new Date();  
  38.    System.out.println(”—-程序结束运行—-,程序运行时间【”  
  39.      + (date2.getTime() - date1.getTime()) + ”毫秒】”);  
  40. }  
  41. }  
  42.   
  43. class MyCallable implements Callable<Object> {  
  44. private String taskNum;  
  45.   
  46. MyCallable(String taskNum) {  
  47.    this.taskNum = taskNum;  
  48. }  
  49.   
  50. public Object call() throws Exception {  
  51.    System.out.println(”>>>” + taskNum + “任务启动”);  
  52.    Date dateTmp1 = new Date();  
  53.    Thread.sleep(1000);  
  54.    Date dateTmp2 = new Date();  
  55.    long time = dateTmp2.getTime() - dateTmp1.getTime();  
  56.    System.out.println(”>>>” + taskNum + “任务终止”);  
  57.    return taskNum + “任务返回运行结果,当前任务时间【” + time + “毫秒】”;  
  58. }  
  59. }  
import java.util.concurrent.*;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;

/**
* 有返回值的线程
*/
@SuppressWarnings("unchecked")
public class Test {
public static void main(String[] args) throws ExecutionException,
    InterruptedException {
   System.out.println("----程序开始运行----");
   Date date1 = new Date();

   int taskSize = 5;
   // 创建一个线程池
   ExecutorService pool = Executors.newFixedThreadPool(taskSize);
   // 创建多个有返回值的任务
   List<Future> list = new ArrayList<Future>();
   for (int i = 0; i < taskSize; i++) {
    Callable c = new MyCallable(i + " ");
    // 执行任务并获取Future对象
    Future f = pool.submit(c);
    // System.out.println(">>>" + f.get().toString());
    list.add(f);
   }
   // 关闭线程池
   pool.shutdown();

   // 获取所有并发任务的运行结果
   for (Future f : list) {
    // 从Future对象上获取任务的返回值,并输出到控制台
    System.out.println(">>>" + f.get().toString());
   }

   Date date2 = new Date();
   System.out.println("----程序结束运行----,程序运行时间【"
     + (date2.getTime() - date1.getTime()) + "毫秒】");
}
}

class MyCallable implements Callable<Object> {
private String taskNum;

MyCallable(String taskNum) {
   this.taskNum = taskNum;
}

public Object call() throws Exception {
   System.out.println(">>>" + taskNum + "任务启动");
   Date dateTmp1 = new Date();
   Thread.sleep(1000);
   Date dateTmp2 = new Date();
   long time = dateTmp2.getTime() - dateTmp1.getTime();
   System.out.println(">>>" + taskNum + "任务终止");
   return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
}
}
代码说明:
上述代码中Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
public static ExecutorService newFixedThreadPool(int nThreads)
创建固定数目线程的线程池。
public static ExecutorService newCachedThreadPool()
创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

转载于:http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html




2026 拉勾网:JA4+指纹绕过 + sign逆向 + 动态城市参数,月采集10万+数据实战 2026年拉勾网反爬技术全面升级,采用JA4+ TLS指纹识别、动态sign签名等多维度防护体系。本文提供工业级爬虫解决方案,通过curl_cffi模拟浏览器指纹、逆向sign加密算法、动态生成城市参数三大核心技术,实现高效稳定的数据采集。系统采用分层架构设计,包含任务调度、签名生成、多线程引擎等模块,单月可获取10万+条招聘数据。重点解析了JA4+指纹识别原理、传统方法的局限性,以及通过HMAC-SHA256算法逆向sign参数的完整过程。 阅读详情

相关推荐

开源DIY龙门架:从零构建可编程运动控制平台

运动控制是自动化与机器人技术的核心基础,它通过精确指令驱动执行机构,实现物体的定位与轨迹规划。其原理通常涉及控制器、驱动器、电机与传动机构的协同工作,核心价值在于将数字指令转化为精准的物理运动,从而解放人力并提升作业一致性。在工业自动化、桌面制造(如3D打印、激光雕刻)及教育机器人等领域应用广泛。本文聚焦于一个具体的工程实践案例:使用**铝型材**、**3D打印**零件、Arduino控制器及步进电机,从机械结构设计、电路连接到代码编写,手把手教你打造一个模块化、可扩展的开源龙门架系统。该系统不仅成本可控,

weixin_33168937的博客 614

java多线程2(Callable)

一、使用Callable+Future获取结果: //实现有返回值的多线程 public class CallableTest { /** * @param args * @throws ExecutionException  * @throws InterruptedException  */ public static void main(String[] args)

sunshine的博客 252

SAP MTS计划策略40实战:如何配置‘带最终组装的计划‘提升定制化生产效率

本文深入解析SAP计划策略40(带最终组装的计划)的核心机制与实战配置。该策略通过“需求消耗”与“组装灵活性”,有效融合按库存生产(MTS)与按订单生产(MTO)的优势,帮助制造企业在保持通用组件库存稳定的同时,快速响应客户的定制化需求,从而提升生产效率与客户满意度。

ruby5的博客 966

关于多线程Callable和Future

---------------------- android培训、java培训、期待与您交流! ---------------------- 关于多线程Callable和Future 实现多线程我们可以继承Thread类或者实现Runnable接口,通过Thread类把run()方法包装成线程执行体,但是这两种方法都不能直接把任意方法直接包装成线程执行体,比如说一个带返回值的方

初学者 347

基于Vivado2025的UltraScale+时序收敛优化实战案例

深入解析在Vivado2025环境中针对UltraScale+架构的时序收敛挑战,结合实际设计案例,分享关键优化策略与操作技巧,显著提升设计性能与收敛效率。vivado2025的更新特性为时序优化带来新机遇。

weixin_33660045的博客 343

DBeaver连接ClickHouse保姆级教程:从安装到成功测试(附驱动下载问题解决)

本文提供了一份详细的DBeaver连接ClickHouse实战指南,重点解决了驱动下载失败等常见问题。文章从环境准备、DBeaver安装讲起,详细阐述了手动配置ClickHouse驱动的可靠方案,并逐步指导完成连接配置与测试,最后介绍了基础操作与查询优化技巧,旨在帮助用户高效完成连接并快速上手使用。

pink的博客 875

JAVA多线程实现的三种方式及内部原理

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的

honghailiang的专栏 6082

基于Gurobi的综合能源系统运行优化:鲁棒两阶段优化方法

本文提出了一种基于Gurobi的综合能源系统鲁棒两阶段优化方法,针对包含换电站、光伏发电和电池储能的系统运行问题。研究采用多面体不确定性集合描述光伏出力随机性,构建了考虑电池衰减成本和弃光惩罚的两阶段优化模型:第一阶段制定日前调度计划,第二阶段处理实时运行中的不确定性。通过列与约束生成算法求解模型,并使用Python和Gurobi实现。仿真验证了该方法能有效平衡系统经济性与鲁棒性,为含高比例可再生能源的综合能源系统运行提供了实用解决方案。

huanghm88的专栏 241

JAVA多线程的三种创建方式

一、概述 在JAVA中,用Thread类代表线程,所有线程对象,都必须是Thread类或者Thread类子类的实例。每个线程的任务就是执行一段顺序执行的代码,JAVA使用线程执行体来容纳这段代码。所以,我们创建线程时,主要是根据实际需求,编写放入线程执行体的代码。 二、三种创建方式 2.1第一种,通过继承Thread类创建线程类 通过继承Thread类来创建并启动多线程的步骤...

yangyechi的博客 6万+

harbor x509: certificate signed by unknown authority【20251222】

本教程通过「合并证书链(服务器端)+ 预置根 CA(客户端)」彻底解决了自签名证书的 x509 错误,同时集成了 Trivy 漏洞扫描,实现了 Harbor 从搭建到实用的全流程。证书链合并是服务器端的关键,确保客户端获取完整信任路径;客户端需同时配置「系统信任库 + Docker 信任目录」,避免 Docker 独立信任机制导致的问题;所有 IP 需保持一致(Harbor 配置、证书绑定、客户端访问),是避免错误的基础。

老韩的Linux云计算架构师进阶之路 681

智能能效管家:基于 ESP32 的智能插座设计与精细化功耗管理实现

针对传统插座无法远程控制、功耗监测缺失、能源浪费严重等问题,本文设计一款基于 ESP32 主控芯片的智能插座。该系统集成 WiFi 无线通信、交流功耗采集、继电器通断控制模块,实现四大核心功能。硬件采用模块化选型与安全接线设计,软件基于 Arduino-ESP32 框架开发,搭载 Mqtt 通信协议与功耗算法,可通过手机 / 云端实时管控设备,有效提升用电安全性与能源利用率。:ESP32;智能插座;功耗管理;远程控制;能耗监测。

weixin_42300449的博客 101

《JAVA多线程编程核心技术》-- 第一章 -- java多线程技能

1.1 进程和多线程的概念以及线程的优点 进程: 进程是操作系统进行资源分配和调度的基本单位(可以将windows中任务管理器中的每个exe程序理解为一个进程) 线程: 线程可以理解为进行中独立运行的主任务 例如: 电脑管家这个程序可以看做一个进程,电脑管家里的病毒查杀,清理垃圾等可以做为线程 单线程与多线程的区别: 相对于单线程,多线程可以同时处理多个任务,减少总的任务完成时间,这是多线...

kai3123919064的博客 317

利用R批量计算相关系数

批量求相关系数

weixin_52073820的博客 1458

Java实现多线程的三种方法

实现多线程有三种方法 继承Thread类 实现Runnable接口 实现Callable接口 Java代码示例 package thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;...

技术小青年一枚 1174

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java多线程实现的三种方法

继承Thread类实现多线程 Java.lang.Thread是线程操作的核心类,新建一个线程最简单的方法就是直接继承Thread类,而后覆写run()方法。 //继承Thread类实现多线程 //线程主体类 class MyThread extends Thread{ private String title; public MyThread(String title) ...

I_can_1的博客 392

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java:多线程 的三种实现方法

本文详细介绍了java中多线程的三种实现方法,包含原理、例子、代码以及我自己的理解等,保证一看就懂。

Cosmoshhhyyy的博客 473

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java中实现多线程的三种方法

多线程的好处想必大家都深有体会,下面我就来简单介绍一下Java中实现多线程的三种方法:继承Thread类创建线程类、通过Runnable接口创建线程类、通过Callable和Future创建线程。

xiaolangfanhua的博客 1081

Java多线程三种实现方法

多线程指单个进程(程序)可以并行执行多个线程,在同一时间执行多个线程以提高程序的处理能力和运行效率,并有利于更好地运用系统资源。提示:以下是本篇文章正文内容,下面案例可供参考。

Iurzy的博客 1843

【Java多线程】多线程的三种实现方式和多线程常用方法

在main()方法中,你可以创建和启动额外的线程,这些线程称为子线程。子线程可以并行执行,与主线程同时进行。多线程的三种实现方式如下: 继承Thread类的方式进行实现 实现Runnable接口的方式进行实现 利用Callable接口和Future接口方式实现

m0_65277261的博客 5094

Java 多线程的三种实现方法

转自:微点阅读 https://www.weidianyuedu.comJava SE高级开发——多线程的实现进程与线程的概念:进程:操作系统中,一个程序的执行周期称为一个进程线程:一个程序同时执行多个任务的时候,我们把每一任务称作一个线程进程与线程相比较,线程更”轻量级“,创建、撤销一个线程比启动一个进程开销要小的多。但是,没有进程就没有线程,进程一旦终止,其内的线程也不再存在。多线程与多进程的区别:每个进程都拥有自己的完整变量,而线程之间则共享数据。共享数据使得线程间通信更加方便、有效。多线程实现:1

xiaoweids的博客 188

Java多线程-三种实现方法

参考链接: Java多线程【三种实现方法】 - hjk-airl - 博客园

qq_44885775的博客 134

Java多线程【三种实现方法】

java多线程 并发与并行 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行 并行:一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。 对比:并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行) 进程与线程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础

m0_68064743的博客 6767

java实现多线程的三种方法

1、练习Thread,实现多线程同步下载图片 1.1 导入commons-io包 在项目中建立一个 lib 文件夹,将下载的commons-io包复制进去。 对 lib 文件夹右键,点击Add As Library。成功之后commons-io可以点开,如下图所示: 1.2 下载类 利用commons-io包中的FileUtils.copyURLToFile方法来下载图片 class WebDownloader { //下载方法 public void downloader(Strin

yuckai的博客 327

java实现多线程方法_Java实现多线程的三种方式

Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。前两种方式启动的线程没有返回值,启动后与主线程没有任何关系,主线程也不知道子线程是否执行结束;后一种方式线程有返回值,启动后主线程可以根据线程对象来判断显示是否结束以及获取线程执行结果,前者多用于,当执行一个主要任务时需要执行一个...

weixin_32247455的博客 344

Java——实现Java多线程的三种方法

Java虚拟机允许应用程序并发地运行多个线程。在Java语言中,多线程的实现一般有以下3种方法,其中前两种是最常用的方法。 1.继承Thread类,重写run()方法 Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例。并且,启动线程的唯一方法就是通过Thread类的start()方法。 start()方法是一个native(本地)方法,它将启动一个新线程,并执...

Searchin_R的博客 637

Java 实现多线程的三种方法

1.继承Thread类 类 Thread的类头为:public class Thread implement runnable 继承Thread类,并重写Thread中的run方法 例如: 1 package com.dragon.test; 2 3 public class MyThread extends Thread{ 4   @Override 5   public void run(){ 6     System.out.pri...

好好学习,天天向上 146
上一篇: POI导出工具类
下一篇: Mybatis-Generator自动生成代码
程序员青戈
程序员青戈 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 3万+粉丝 250原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值