并发编程——多线程基础(一)

线程的基本认识

什么是进程?

每一个应用程序就是进程,windows系统下 Ctrl+Alt+Del 调出任务管理器,看到进程列表,可以详细的看到开启了哪些进程。

用户每启动一个进程,操作系统就会为该进程分配一个独立的内存空间。

什么是线程?

线程存在于进程之中,一个进程包含一个或多个线程。例如迅雷与百度云盘的下载任务,可以同时下载多个文件,而每一个下载任务就是一个线程。线程之间可以并发(肉眼可见的同时执行)执行。而下载任务的线程又依赖于进程,如果你把软件进程杀死,那么线程就会停止下载任务。

疑惑点:并发是同一时刻的同时进行么?

单核cpu的是永远不会同一时刻执行两个任务的。只是我们肉眼可见的觉着同时再进行。而多核CPU就可以做到同时执行多个任务,毕竟是cpu在工作。

疑惑点:既然每一时刻只能执行一个任务,那么多线程如何提高程序的效率呢?

假如你同时运行着网易云听歌,百度云下载10文件。那么cpu再每一个时间点都会有一个线程再被执行。而执行网易云听歌与下载任务的分配就是 1:10,虽然cpu在同一时刻只能做一件事情,但是你百度云的竞争者线程多啊,那么你下载的效率就会提高!

线程的创建

一、继承 extends Thread

class CreateThread extends Thread {
	// run方法中编写 多线程需要执行的代码
	publicvoid run() {
		for (inti = 0; i< 10; i++) {
			System.out.println("i:" + i);
		}
	}
}
publicclass ThreadDemo {

	publicstaticvoid main(String[] args) {
		System.out.println("-----多线程创建开始-----");
		// 1.创建一个线程
		CreateThread createThread = new CreateThread();
		// 2.开始执行线程 注意 开启线程不是调用run方法,而是start方法
		System.out.println("-----多线程创建启动-----");
		createThread.start();
		System.out.println("-----多线程创建结束-----");
	}

        
}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

二、实现接口 implements Runnable

class CreateRunnable implements Runnable {

	@Override
	publicvoid run() {
		for (inti = 0; i< 10; i++) {
			System.out.println("i:" + i);
		}
	}

publicclass ThreadDemo2 {
	publicstaticvoid main(String[] args) {
		System.out.println("-----多线程创建开始-----");
		// 1.创建一个线程
		CreateRunnable createThread = new CreateRunnable();
		// 2.开始执行线程 注意 开启线程不是调用run方法,而是start方法
		System.out.println("-----多线程创建启动-----");
		Thread thread = new Thread(createThread);
		thread.start();
		System.out.println("-----多线程创建结束-----");
	}
}

疑惑点:为什么是调用star()而不是run()呢?

start():start()用来启动一个线程,当调用start()方法时,系统才会开启一个子线程,通过Thead类中start()方法来启动的线程处于就绪状态(可运行状态),此时并没有运行,而是和其他线程一起竞争cpu的执行权,一旦得到CPU时间片,就自动开始执行run()方法。

run():run()方法只是处理子线程业务逻辑代码的存放地。如果在主线程中直接调用,就和调用一个普通的方法没有什么区别。并且还要等待run方法运行结束才能继续执行下面代码。那么多线程将变得毫无意义。

线程的五种状态

新建状态(new):使用new关键字将线程的实体类穿件出来

就绪状态(Runnable):调用方法start,线程进入等待执行状态

运行状态(Running):获取到CPU的执行权,正在运行重写的run方法

阻塞状态(Blocked):当前线程让出CPU的执行权,例如调用sleep方法,使其处于休眠状态

死亡状态(Dead):线程正常运行结束,或者异常终止

 

遗留问题?

run方法是void,如何再线程结束返回一个结果呢?

future模式了解一下。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值