聊聊多线程(一)线程的基础,linux 集群架构师
==================================================================
[](
)进程和线程
进程:正在运行的程序,需要内存和 CPU 资源进行运算执行,
一个程序包含一个或多个进程
线程:是进程的组成单元,一个进程包含一个或多个线程,每个线程负责单独执行一个任务
进程和线程的区别:
一个进程包含一个或多个线程
每个进程都有自己独立的内存空间,线程没有自己独立的内存空间,线程共享所在进程的内存空间
进程是重量级的单元,需要系统资源比较多,线程是轻量级单元,需要资源比较少
[](
)多进程和多线程
多进程是操作系统可以同时运行多个进程。一个 CPU 内核一个时间只能执行一个进程,CPU 会在多个进程之间进行来回切换,因为速度特别快,用户感觉不到。
多线程是一个进程里面有多个线程,CPU 执行进程时会来回切换里面所有的线程,每个线程会分配到一定的 CPU 的执行时间(CPU 时间片)
[](
)多线程的应用场景
JAVAEE 企业级开发:大量的用户需要同时访问网站的服务器,如:双十一、秒杀等。如果服务器只有一个线程,多个用户需要排队和服务器通信,效率非常低;多线程就是一个用户连接服务器后,服务器就会开一个新线程负责用户的通信,用户之间就不会相互影响。
游戏开发:同时进行网络通信、游戏角色控制、图形绘制等操作,必须每个用一个线程执行。
[](
)并行和并发
并发:一个 CPU 在多个线程之间快速切换,达到同时执行多个任务的目的
并行:多个 CPU 可以同时执行一个进程中的多个线程
[](
)线程的实现
[](
)1、 继承 Thread 类
继承 Thread 类
重写 run 方法
创建线程对象,调用 start 方法
/**
自定义线程类
@author xray
*/
public class MyThread extends Thread{
/**
执行线程任务的方法
*/
public void run(){
//Thread.currentThread()是获得系统当前执行的线程
System.out.println(Thread.currentThread().getName()+"线程执行了!!!");
}
public static void main(String[] args) {
//主线程中执行
System.out.println(Thread.currentThread().getName()+"线程执行了!!!");
//创建线程对象
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
//启动线程
thread1.start();
thread2.start();
}
}
[](
)2、实现 Runnable 接口
实现 Runnable 接口
实现 run 方法
创建自定义线程对象,作为参数传入 Thread 对象
调用 start 方法
/**
自定义线程类
@author xray
*/
public class MyRunnable implements Runnable{
/**
实现 run 方法
*/
@Override
public void run() {
System.out.println("当前执行的线程是:"+Thread.currentThread().getName());
}
public static void main(String[] args) {
//创建 Thread 对象,传入 Runnable 对象
Thread thread1 = new Thread(new MyRunnable());
//调用 start 方法
thread1.start();
//使用匿名内部类实现 Runnable
Thread thread2 = new Thread(new Runnable(){
@Override
public void run() {
System.out.println("匿名内部类,当前执行的线程是:"+Thread.currentThread().getName());
}
});
thread2.start();
//使用 Lambda 实现 Runnable
Thread thread3 = new Thread(()->{
System.out.println("Lambda,当前执行的线程是:"+Thread.currentThread().getName());
});
thread3.start();
}
}
[](
)3、实现 Callable 接口
前面两种方法都不能返回结果,Callable 的方法可以返回值
实现 Callable 接口,实现 call 方法
创建 FutureTask 对象,传入 Callable 对象
创建 Thread 对象,传入 FutureTask 对象
调用 Thread 对象的 start 方法
调用 FutureTask 对象的 get 方法,获得返回值
评论