三种添加线程的方式及其区别

我们常见的添加线程的方法通常是两种:
①继承Thread类,实现run方法,调用start()方法开启线程;
②实现Runnable接口,实现run方法, 调用start()方法开启线程;
其实还有第三种常用的添加线程的方式:
通过Callable和Future创建线程


1. 继承Thread类添加线程

使用该方法添加线程的步骤是:
第一步:创建类继承Thread类
第二步:实现run方法,将任务写在run方法里面
第三步:在main方法new出该类,调用start方法开启线程

代码实现如下:


public class ThreadTest extends Thread {
	
	//实现run方法
	@Override
	public void run() {
		for(int i=0;i<=6;i++) {
		   System.out.println(Thread.currentThread().getName() + "--" + i);
		   try {
			Thread.sleep(new Random().nextInt(100));  //休眠
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
		System.out.println(Thread.currentThread().getName()+"--finsh");
	}
	
	
	public static void main(String[] args) {
		new ThreadTest("A").start();
		new ThreadTest("B").start();
	}
	
}

输出结果为(结果不唯一):

Thread0–1
Thread1–1
Thread0–2
Thread0–3
Thread1–2
Thread1–3
Thread0–4
Thread0–5
Thread0–6
Thread0–finish
Thread1–4
Thread1–5
Thread1–6
Thread1–finish

我们可以发现,继承Thread类创建的线程可以拥有自己独立的类成员变量i。

2.实现Runnable接口创建线程

使用该方法创建线程的步骤是:
第一步:创建类实现Runnable接口;
第二步:实现run方法,将任务写在run方法内;
第三步:创建Thread对象,创建Runnable实例,将其传入Thread对象中;
第四步:调用start方法开启线程。

代码实现如下:

public class RunableTest implements Runnable{
	private int j;
	
	//实现run方法
	@Override
	public void run() {
		for(int i=0;i<=10;i++) {
			   try {
				Thread.sleep(new Random().nextInt(100)); //休眠
				j++;
				 System.out.println(Thread.currentThread().getName()+"--"+j);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
			System.out.println(name+" finsh");
	}
 	
  public static void main(String[] args) {
	  RunableTest R=new RunableTest();
	  new Thread(R).start();
	  new Thread(R).start();
	}
}

执行结果为:

Thread0–1
Thread1–2
Thread0–3
Thread0–4
Thread1–5
Thread1–6
Thread0–7
Thread0–8
Thread0–9
Thread0–10

在加入休眠操作之后,可以发现,虽然线程不同,但是i却是进程共享的。

3.通过Callable和Future创建线程

先简单了解以下Callable和Future接口以及他的实现类FutureTask:

  • Callable是一个接口,它与Runnable极其相似,但在Runnable接口中run方法是线程执行体,而在Callable中call方法是线程执行体。
  • call能够实现run能实现的所有功能,除此之外还多出以下两个功能:
    • call方法允许有返回值,可以在执行完后返回数据;
    • call方法能够声明抛出的异常;
  • FutureTask类实现了Runnable和Future接口;
  • Future接口是对Callable任务的执行结果进行取消,查询是否完成。

使用该方法创建线程的步骤是:
第一步:创建类实现Callable接口;
第二步:实现call方法, 将任务放在call方法内;
第三步:创建Callable实例,创建FutureTask实例,将Callable实例传入FutureTask中;
第四步:创建Thread对象,将FutureTask实例传入Thread对象中;
第五步:调用start方法, 开启线程。

代码实现如下:


import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
 
public class CallableTest implements Callable<Integer> {

   //实现call方法
	@Override
	public Integer call() throws Exception {
		int i=0;
		for(;i<10;i++) {
			   System.out.println(Thread.currentThread().getName()+ "--" + i);
			   try {
				Thread.sleep(new Random().nextInt(100));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			}
			System.out.println("finsh");
		return i;
	}
 
public static void main(String[] args) {
	CallableTest callable1 = new CallableTest();
	CallableTest callable2 = new CallableTest();
	FutureTask<Integer> furureTask1 = new FutureTask<Integer>(callable1);
	FutureTask<Integer> futureTask2 = new FutureTask<Integer>(callable2);
	new Thread(Task1).start();
	new Thread(Task2).start();
	}
}

输出结果如下:

Thread0–1
Thread1–1
Thread0–2
Thread0–3
Thread1–2
Thread0–4
Thread0–5
Thread0–6
finish
Thread1–3
Thread1–4
Thread1–5
Thread1–6
finish

在该输出方法中,线程在执行过程中并不会输出返回值,如果要获得返回值则调用futureTask1.get()即可得到返回值。

4.区别:

三者区别在以上已经有所说明,总结来说有以下三点:

  1. 继承Thead类创建的线程可以拥有独立的成员变量,而实现Runnable接口创建的线程中的成员变量则是进程共享的;
  2. 三者的创建方式有所不同;
  3. 使用Callable和Task创建的线程的执行体与前两者的执行体不同,前两者是run方法作为执行体,后者是call方法作为执行体。call方法作为执行体有以下两个优势:1)call方法允许有返回值,可以在执行完后返回数据;
    2) call方法能够声明抛出的异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 鲲鹏指令架构是华为推出的一种基于ARMv8架构的64位指令集架构。它采用了全新的指令集设计,支持128位SIMD指令,以及更高效的向量运算。鲲鹏指令架构还支持更大的物理地址空间和更多的虚拟地址空间,从而支持更高的内存容量和更大的虚拟机密度。 与ARMv8的指令架构相比,鲲鹏指令架构具有以下区别: 1. 鲲鹏指令架构采用了全新的指令集设计,支持更多的向量运算和更高效的数据处理。 2. 鲲鹏指令架构支持更大的物理地址空间和更多的虚拟地址空间,从而支持更高的内存容量和更大的虚拟机密度。 3. 鲲鹏指令架构的设计优化了CPU的能耗和性能,采用了更先进的制造工艺,从而具有更高的能效比和更好的性价比。 总体来说,鲲鹏指令架构是一种更高效、更灵活、更适合数据中心和云计算等高性能场景的指令架构。 ### 回答2: 鲲鹏是华为公司开发的一种高性能指令架构。它主要用于服务器和云计算领域,并且在人工智能和大数据处理方面也具有较高的适应性。 鲲鹏指令架构采用了一个多核架构,每个核心都包含多个线程,能够同时处理多个任务。这使得鲲鹏具有较高的并发处理能力,并且能够在不同应用场景下实现优化。 与之前的指令架构相比,鲲鹏具有以下几个区别: 1. 高性能:鲲鹏采用的多核心架构使得它可以同时处理多个任务,提高了处理速度和性能。这使得鲲鹏在服务器领域具有很大的竞争优势。 2. 高并发:鲲鹏能够同时运行多个线程,实现并发处理。这对于一些需要高并发处理的应用程序非常重要,例如云计算和大数据处理等。 3. 低功耗:鲲鹏采用了能效优化技术,使得它能够在提供高性能的同时,保持较低的功耗。这对于节能环保和长时间运行的服务器设备非常重要。 4. 高安全性:鲲鹏指令架构还具有较高的安全性。它采用了硬件级别的安全保护技术,包括存储密、隔离技术和访问控制等,可以有效防御恶意攻击和数据泄漏等安全威胁。 综上所述,鲲鹏指令架构是一种高性能、高并发、低功耗、高安全性的指令架构。它在服务器和云计算领域具有很大的应用潜力,并且在人工智能和大数据处理方面也具有较好的适应性。 ### 回答3: 鲲鹏指令架构是华为自主研发的一种全新的指令集架构,以华为海鲲鹏系列处理器为基础。相比传统的CISC(Complex Instruction Set Computer)和RISC(Reduced Instruction Set Computer)架构,鲲鹏指令架构有以下几个显著的区别: 1. 完全冗余指令集架构(Cyber Resilient Architecture,CRA):鲲鹏指令架构采用了完全冗余的设计,能够在硬件层面自动检测和纠正错误。这种架构使得处理器具备更高的可靠性和稳定性,提升了系统的容错能力。 2. 弹性处理单元(Elastic Compute Unit,ECU):鲲鹏指令架构引入了弹性处理单元,使得处理器在单个周期内能够执行多个指令,并且可以动态地调整资源分配,以适应不同的计算需求。这种架构优化了处理器的执行效率和能耗控制。 3. Accelerate AI(速人工智能):鲲鹏指令架构支持硬件级别的AI速,通过添加指令集和AI模块,提供对深度学习推理的全面支持。这种架构的引入大大提高了处理器在AI应用中的计算性能和效率。 4. MxU(Multiple x Unit):鲲鹏指令架构拥有丰富的处理单元,包括向量单元、浮点单元、整数单元等,能够同时执行多个指令,提高处理器的并发度和计算能力。这种多单元架构能够针对不同的应用场景优化计算,提供更高的性能和效率。 总体而言,鲲鹏指令架构通过冗余设计、弹性处理单元、AI速和多单元架构等特点,提供了更可靠、高效和灵活的计算能力。这种架构不仅适用于各类服务器和数据中心场景,还能够满足人工智能计算的需求,并对未来的计算应用提供了更好的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值