写点什么

聊聊多线程(一)线程的基础,linux 集群架构师

用户头像
极客good
关注
发布于: 刚刚

==================================================================

[](

)进程和线程


  • 进程:正在运行的程序,需要内存和 CPU 资源进行运算执行,


一个程序包含一个或多个进程


  • 线程:是进程的组成单元,一个进程包含一个或多个线程,每个线程负责单独执行一个任务

  • 进程和线程的区别:


  1. 一个进程包含一个或多个线程

  2. 每个进程都有自己独立的内存空间,线程没有自己独立的内存空间,线程共享所在进程的内存空间

  3. 进程是重量级的单元,需要系统资源比较多,线程是轻量级单元,需要资源比较少

[](

)多进程和多线程


  • 多进程是操作系统可以同时运行多个进程。一个 CPU 内核一个时间只能执行一个进程,CPU 会在多个进程之间进行来回切换,因为速度特别快,用户感觉不到。

  • 多线程是一个进程里面有多个线程,CPU 执行进程时会来回切换里面所有的线程,每个线程会分配到一定的 CPU 的执行时间(CPU 时间片)

[](

)多线程的应用场景


  • JAVAEE 企业级开发:大量的用户需要同时访问网站的服务器,如:双十一、秒杀等。如果服务器只有一个线程,多个用户需要排队和服务器通信,效率非常低;多线程就是一个用户连接服务器后,服务器就会开一个新线程负责用户的通信,用户之间就不会相互影响。

  • 游戏开发:同时进行网络通信、游戏角色控制、图形绘制等操作,必须每个用一个线程执行。

[](

)并行和并发


  • 并发:一个 CPU 在多个线程之间快速切换,达到同时执行多个任务的目的

  • 并行:多个 CPU 可以同时执行一个进程中的多个线程

[](

)线程的实现

[](

)1、 继承 Thread 类


  1. 继承 Thread 类

  2. 重写 run 方法

  3. 创建线程对象,调用 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();


}


}


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码
[](

)2、实现 Runnable 接口


  1. 实现 Runnable 接口

  2. 实现 run 方法

  3. 创建自定义线程对象,作为参数传入 Thread 对象

  4. 调用 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 的方法可以返回值


  1. 实现 Callable 接口,实现 call 方法

  2. 创建 FutureTask 对象,传入 Callable 对象

  3. 创建 Thread 对象,传入 FutureTask 对象

  4. 调用 Thread 对象的 start 方法

  5. 调用 FutureTask 对象的 get 方法,获得返回值

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
聊聊多线程(一)线程的基础,linux集群架构师