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

程序: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接口

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

使用线程:

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;
	}
}

执行结果





猜你喜欢

转载自blog.csdn.net/qq_41541619/article/details/80483466