博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA多线程(一) 创建线程的三种方式
阅读量:3905 次
发布时间:2019-05-23

本文共 2160 字,大约阅读时间需要 7 分钟。

程序: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
{ public static void main(String[] args) throws InterruptedException, ExecutionException { // 创建线程 ExecutorService ser = Executors.newFixedThreadPool(1); Race tortoise = new Race(); // 获取值 Future
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
{ @Override public Integer call() throws Exception { return 100; }}

执行结果

 

 

 

你可能感兴趣的文章
Open Judge 4010 :2011
查看>>
百练OJ-2815 城堡问题【DFS】
查看>>
CODE[VS] 1025 选菜 【背包】
查看>>
POJ 1724 ROADS【DFS+剪枝】
查看>>
AOJ 847 整数拆段
查看>>
AOJ 848 分数拆分
查看>>
UVA 133 The Dole Queue 【约瑟夫环】
查看>>
XDOJ 1208 B.笑爷买房 【DFS】
查看>>
部门年度工作总结的内容
查看>>
pandas学习笔记
查看>>
Numpy笔记
查看>>
正则表达式
查看>>
python线程进程笔记
查看>>
TensorFlow初学者必须了解的55个经典案例
查看>>
机器学习笔记
查看>>
数十种TensorFlow实现案例汇集:代码+笔记
查看>>
python记录的错误与知识
查看>>
内核中各种套接字的关系
查看>>
linux sysctl 参数实现 暨 ip_forward参数对Linux内核转发影响分析
查看>>
linux 路由表 的一些相关资料
查看>>