JAVA多线程(一) 创建线程的三种方式

本文详细介绍了在Java中创建线程的三种主要方法:继承Thread类并重写run()方法、实现Runnable接口并创建Thread实例、实现Callable接口并利用Future获取返回值。通过具体示例说明了每种方法的应用场景及优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序:program,是一个静态概念;指令集

进程:process,是一个动态概念;由操作系统调度程序

线程:thread,是进程中一个“单一的连续控制流程”;在进程内多条执行路径;是一个轻量级的线程

 

(一)继承至Thread,重写run()方法

使用线程:

       1. 创建子类对象

       2. 调用start()方法,启动线程

以龟兔赛跑为例 

1. 创建两个线程

public class Rabbit extends Thread{
	@Override
	public void run() {
		for (int i = 1; i < 100; i++) {
			System.out.println("兔子跑了" + i + "步");
		}
	}
}

class Tortoise extends Thread{
	@Override
	public void run() {
		for (int i = 1; i < 100; i++) {
			System.out.println("乌龟跑了" + i + "步");
		}
	}
}

2. 测试类

public class RabbitApp {
	public static void main(String[] args) {
		// 创建子类对象
		Rabbit rabbit = new Rabbit();
		Tortoise tortoise = new Tortoise();
		
		//调用run方法
		rabbit.start();
		tortoise.start();
		
		for (int i = 0; i < 100; i++) {
			System.out.println("mian-->" + i);
		}
	}
}

3. 执行结果

在上面的程序中,共有三个线程:兔子线程,乌龟线程,main主线程

 

(二)实现Runnable接口,重写run方法

在这个地方会涉及到静态代理模式,感兴趣的可以去了解一下

使用线程:

       1. 创建真实角色

       2. 创建代理角色 + 真实对象的引用

       3. 调用start()方法启动线程

模拟同时做两件事:聊qq,敲代码

1. 创建一个线程

public class Programmer implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("聊qq");
		}	
	}
}

2. 测试,也是一个线程

public class ProgrammerApp {
	public static void main(String[] args) {
//		 * 1.创建真实角色
		Programmer pro = new Programmer();
//		 * 2.创建代理角色+真实角色引用
		Thread proxy = new Thread(pro);
//		 * 3.调用start方法
		proxy.start();
		
		for (int i = 0; i < 100; i++) {
			System.out.println("敲代码!");
		}
	}
}

3. 执行结果

推荐使用:

       1. 避免单继承的局限性,类只能单继承,接口可以实现多继承

       2. 便于共享资源

 

(三)实现Callable接口

       如果想要在线程中返回值或者声明异常,就要使用到这种方式,因为前面两种方式不能返回值,也不能对外声明异常,但此方式不常用,且实现起来很繁琐。

使用线程:

       1. 创建Callable实现类,重写call()方法

       2. 借助执行调度服务ExecutorService,获取Future对象

       3. 获取值

       4. 停止服务

模拟获取一个线程的返回值

public class Cal implements Callable<Integer> {

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		// 创建线程
		ExecutorService ser = Executors.newFixedThreadPool(1);
		Race tortoise = new Race();
		// 获取值
		Future<Integer> result = ser.submit(tortoise);
		int num = result.get();
		System.out.println(num);
		// 停止服务
		ser.shutdownNow();
	}

	@Override
	public Integer call() throws Exception {
		return 1000;
	}
}

class Race implements Callable<Integer> {
	
	@Override
	public Integer call() throws Exception {
		return 100;
	}
}

执行结果

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值