`
greemranqq
  • 浏览: 977070 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

多线程-初识(一)

阅读更多

 线程有多种实现的方式:

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基础精品课01-初识java.zip

    Java支持多线程编程,这意味着一个程序可以同时执行多个任务。通过创建Thread对象或者实现Runnable接口,开发者可以创建并发执行的代码块。 此外,Java提供了丰富的标准库,包括I/O流、网络编程、日期和时间API等。...

    初识通信——多线程服务器的建立

    在IT行业中,多线程服务器的建立是网络编程的一个重要组成部分,特别是在高并发场景下,如Web服务、游戏服务器等。本文将详细讲解如何初识通信,并以多线程服务器的构建为例,来阐述相关技术点。 首先,理解多线程...

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    Java多线程的初识与简单的安全问题解决

    多线程 目录 进程 进程的了解 线程 什么是线程 线程的组成 线程的创建 线程的状态 线程的方法 线程的安全问题 1.进程 1.1.进程的了解 简单的来说进程就是运行中的程序,简称为进程。 单核CPU在任意一个时间节点上,...

    HCIA-HarmonyOS Device Developer培训视频教程【共13集】.rar

    07. 第5集-一次开发-多端部署 08. 第6集-统一OS-弹性部署 09. 第7集-开发项目与工具介绍 10. 第8集-OpenHarmony目录结构详细介绍 11. 第9集-OpenHarmony接口分层介绍 12. 第10集-组件开发与HPM介绍 13. 第11集...

    java多线程相关面试题 1

    Java 多线程相关面试题是一组常见的 Java 面试题,涵盖了 Java 多线程编程的基础知识和高级概念。本文将对这些问题进行详细的解释和分析,帮助读者更好地理解 Java 多线程编程。 1. 为什么用线程池? 线程池是 ...

    初识Java_课后补充作业

    9. **多线程**:了解线程的创建方式,同步机制(synchronized关键字、wait()、notify()、notifyAll()),以及线程池的使用。 10. **文件与目录操作**:学习如何在Java中创建、读取、修改和删除文件及目录。 11. **...

    C# 线程相关知识总结

    多线程由内部线程调度程序管理,线程调度器通常是CLR委派给操作系统的函数。线程调度程序确保所有活动线程都被分配到合适的执行时间,线程在等待或阻止时 (例如,在一个独占锁或用户输入) 不会消耗 CPU 时间。 在...

    藏经阁-冬季实战营第一期:从零到一上手玩转云服务器-44.pdf

    2. Linux:Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。 本资源提供了详细的指导和实践经验,旨在帮助用户快速掌握云服务器的...

    深海王国小学生都能玩的语音模块?项目工程文件,(7)初识多线程

    使用方法与介绍,请参考系列文章——【深海王国】小学生都能做的语音模块?

    头歌初识redis答案

    这种设计确保了每个操作的一致性和原子性,同时也避免了多线程环境下可能产生的复杂性。 - **多个数据库支持**:虽然Redis本质上是一个键值存储系统,但它支持多达16个独立的数据库,默认情况下使用的是第0号数据库...

    1.初识Java.zip

    它的设计目标是具备“简单性、面向对象、健壮性、安全性、可移植性、高效性、多线程和动态性”等特性,使得Java能够适应各种应用领域,从小型嵌入式设备到大型企业级系统。 1. **简单性** Java简化了C++的一些复杂...

    JAVA语言技术初识

    7. 多线程:Java原生支持多线程,允许并发执行多个任务,增强了程序的效率。 8. 动态性:Java允许程序在运行时动态加载和调用所需模块,提高了代码的灵活性。 9. 垃圾收集机制:Java中的垃圾收集器自动回收不再...

    halcon机器视觉,这是一个入门例程,以及我自己的一些心得笔记

    HALCON提供了多线程、GPU加速等功能,合理利用可以大大提高处理速度。 - 错误处理:在实际应用中,难免会遇到图像质量问题、匹配失败等情况,因此错误处理机制是必不可少的。 总的来说,"halcon机器视觉"的学习涉及...

    头歌初识redis答案.docx

    ### 头歌初识Redis知识点详解 #### 一、Redis基础知识概述 Redis是一种开源的、高性能的键值存储系统,以其快速的数据存取速度而著称。它支持多种数据结构,能够满足不同的应用场景需求。 - **数据库管理**: - ...

    Java线程初识

    应用程序中可以同时执行多个功能 ==&gt; 多线程 线程使用的是系统资源,该系统资源你是操作系统分配给当前进程使用的。 多个线程的情况下,同时【抢占执行】会导致资源紧缺。 线程抢占过程就类似于进

    初识JVM – JVM概念.pdf

    - **支持的API**:例如反射、安全、多线程等功能。 - **编译过程**:从源代码到字节码再到本地机器码的过程。 #### 六、总结 JVM是Java生态系统的核心组成部分,不仅提供了强大的跨平台能力,还不断通过技术创新...

Global site tag (gtag.js) - Google Analytics