线程有多种实现的方式:
1.实现 Runnable 接口,实现run() 方法
2.继承Thread类,调用start() 方法
3.实现Callable 接口,实现call() 方法,和第一种 差不多,call 方法要抛出异常,run 不会
假设,我们现在有个通知数数的任务,从1-100。
public class Advice implements Runnable{ static int num = 1; @Override public void run() { // 数数 while(num < 100){ System.out.println(num); num ++; } } }
public class ThreadTest { public static void main(String[] args) { Advice a = new Advice(); a.run(); } }
这里很简单,实现Runable run(),方法,和一个普通的方法差不多。但是这样没有任何特殊之处,必须要显示的将这个任务绑定到线程上,才能有效。下面看看Thread 这个线程类的做法。
public class ThreadTest { public static void main(String[] args) { Advice a = new Advice(); Thread t = new Thread(a); t.start(); System.out.println("这是一个线程"); } }
这里 你执行,你会 发现:“这是一个线程会先打印出来,为什么呢?”
Thread 构造器需要一个Runable 对象,调用start 为该线程执行初始化操作,然后调用Runable 的run方法。这里的打印语句在调用run()方法的前,就完成了,因为这其实是2个线程,其中一个是 mian(),他在调用Advice 的时候,是另外一个线程 Thread t ,去调用,不影响main()线程的继续执行,因此 很顺利的久执行下去了。这里说明线程 有调用其他线程的能力,并且“同时”执行。
这里同理,我们在main 线程里面创建5个线程,猜测结果?
public class ThreadTest { public static void main(String[] args) { for(int i=0;i<5;i++){ new Thread(new Advice()).start(); System.out.println("这是一个线程"); } } }
如果你测试了,你就发现结果是每一次都不一样,是混乱的。这里建立5个不同的线程 进行测试更加明显
这里说明:不同任务的执行线程,混在一起的时候,是有线程调度自动控制,会分发给你的处理器分发执行。顺序是不确定的。
下面,我们看看java.unti.concurrent 包中的Executor ,管理你的线程,Executor 在客户端和任务执行时间提供了间接层,允许管理异步执行任务。看看源码和API 还是很好理解。
public class ThreadTest { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); for(int i=0;i<5;i++){ exec.execute(new Advice()); System.out.println("这是一个线程:"+i); } exec.shutdown(); } }
这里是ExecutorService 继承Executor,是具有生命周期的,可以关闭(shutdown)。Executor 提供单一方法 execute(Runanle commod),Executors 有点像工具类,提供了各种静态方法,比如:
newCachedThreadPool :相当于线程池,为每个任务都创建一个线程
newFixedThreadPool:也是线程池,但是可以给定默认的线程数,节约资源。和 StringBuffer(1024) 差不多
newSingleThreadExecutor:单一线程,准确的说是将多个任务,放入一个队列,然后按顺序执行。
可以去多建任务,进行尝试,其他的就自己看看API。
有时候我们任务需要及时的返回一个值,那么就可以用Callable 接口,看代码:
public class TaskWithResult implements Callable<String>{ private int id; public TaskWithResult(int id){ this.id = id; } @Override public String call() throws Exception { return "result of TaskWithResult "+id; } }
public class ThreadTest { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); ArrayList<Future<String>> results = new ArrayList<Future<String>>(); for(int i = 0;i<10;i++){ Future<String> str = exec.submit(new TaskWithResult(i)); results.add(str); } for(Future<String> fs : results){ try { System.out.println(fs.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }finally{ // 不关闭,任务不结束 exec.shutdown(); } } } }
Future 对象是callable 方法返回的,特定的类型,进行了参数化。可以用isDone 来查询它是否完成,完成时,可以调用get()获得结果,如果不用isDone()进行检查,直接调用get(),会阻塞,直到结果准备就绪。
相关推荐
Java支持多线程编程,这意味着一个程序可以同时执行多个任务。通过创建Thread对象或者实现Runnable接口,开发者可以创建并发执行的代码块。 此外,Java提供了丰富的标准库,包括I/O流、网络编程、日期和时间API等。...
在IT行业中,多线程服务器的建立是网络编程的一个重要组成部分,特别是在高并发场景下,如Web服务、游戏服务器等。本文将详细讲解如何初识通信,并以多线程服务器的构建为例,来阐述相关技术点。 首先,理解多线程...
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
多线程 目录 进程 进程的了解 线程 什么是线程 线程的组成 线程的创建 线程的状态 线程的方法 线程的安全问题 1.进程 1.1.进程的了解 简单的来说进程就是运行中的程序,简称为进程。 单核CPU在任意一个时间节点上,...
07. 第5集-一次开发-多端部署 08. 第6集-统一OS-弹性部署 09. 第7集-开发项目与工具介绍 10. 第8集-OpenHarmony目录结构详细介绍 11. 第9集-OpenHarmony接口分层介绍 12. 第10集-组件开发与HPM介绍 13. 第11集...
Java 多线程相关面试题是一组常见的 Java 面试题,涵盖了 Java 多线程编程的基础知识和高级概念。本文将对这些问题进行详细的解释和分析,帮助读者更好地理解 Java 多线程编程。 1. 为什么用线程池? 线程池是 ...
9. **多线程**:了解线程的创建方式,同步机制(synchronized关键字、wait()、notify()、notifyAll()),以及线程池的使用。 10. **文件与目录操作**:学习如何在Java中创建、读取、修改和删除文件及目录。 11. **...
多线程由内部线程调度程序管理,线程调度器通常是CLR委派给操作系统的函数。线程调度程序确保所有活动线程都被分配到合适的执行时间,线程在等待或阻止时 (例如,在一个独占锁或用户输入) 不会消耗 CPU 时间。 在...
2. Linux:Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。 本资源提供了详细的指导和实践经验,旨在帮助用户快速掌握云服务器的...
使用方法与介绍,请参考系列文章——【深海王国】小学生都能做的语音模块?
这种设计确保了每个操作的一致性和原子性,同时也避免了多线程环境下可能产生的复杂性。 - **多个数据库支持**:虽然Redis本质上是一个键值存储系统,但它支持多达16个独立的数据库,默认情况下使用的是第0号数据库...
它的设计目标是具备“简单性、面向对象、健壮性、安全性、可移植性、高效性、多线程和动态性”等特性,使得Java能够适应各种应用领域,从小型嵌入式设备到大型企业级系统。 1. **简单性** Java简化了C++的一些复杂...
7. 多线程:Java原生支持多线程,允许并发执行多个任务,增强了程序的效率。 8. 动态性:Java允许程序在运行时动态加载和调用所需模块,提高了代码的灵活性。 9. 垃圾收集机制:Java中的垃圾收集器自动回收不再...
HALCON提供了多线程、GPU加速等功能,合理利用可以大大提高处理速度。 - 错误处理:在实际应用中,难免会遇到图像质量问题、匹配失败等情况,因此错误处理机制是必不可少的。 总的来说,"halcon机器视觉"的学习涉及...
### 头歌初识Redis知识点详解 #### 一、Redis基础知识概述 Redis是一种开源的、高性能的键值存储系统,以其快速的数据存取速度而著称。它支持多种数据结构,能够满足不同的应用场景需求。 - **数据库管理**: - ...
应用程序中可以同时执行多个功能 ==> 多线程 线程使用的是系统资源,该系统资源你是操作系统分配给当前进程使用的。 多个线程的情况下,同时【抢占执行】会导致资源紧缺。 线程抢占过程就类似于进
- **支持的API**:例如反射、安全、多线程等功能。 - **编译过程**:从源代码到字节码再到本地机器码的过程。 #### 六、总结 JVM是Java生态系统的核心组成部分,不仅提供了强大的跨平台能力,还不断通过技术创新...