5. 线程的实现方式

进程的概念包含两个特点:

  • 资源所有权:一个进程包括一个存放进程映像的虚拟地址空间;一个进程总是拥有对资源的控制或所有权。操作系统提供保护功能,以防止进程之间发生不必要的与资源相关的冲突。
  • 调度/执行:一个进程沿着可以通过一个或多个程序的执行路径执行。其执行过程可能与其他进程的执行过程交替进行。因此,一个进程具有一个执行状态和一个被分配的优先级,它是一个可被操作系统调度和分派的实体。
既然上述两个特点是独立的,为区分这两个特点,分派的单位通常称为线程,而拥有资源所有权的单位通常仍称为进程。

线程的实现可以分为:用户级线程和内核级线程。

  1. 用户级线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。
  2. 内核级线程:由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。
两者的区别:

1)内核级线程是OS内核可感知的,而用户级线程是OS内核不可感知的。


2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。


3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。


4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。


5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。


Java中实现线程有以下几种方式: 1. 继承Thread类:创建一个继承自Thread类的子类,并重写其run()方法来定义线程的执行逻辑。然后通过创建子类的实例并调用start()方法来启动线程。 ```java class MyThread extends Thread { public run() { // 线程的执行逻辑 } } // 创建线程实例并启动线程 MyThread thread = new MyThread(); thread.start(); ``` 2. 实现Runnable接口:创建一个实现了Runnable接口的类,并实现其run()方法来定义线程的执行逻辑。然后通过创建该类的实例,并将其作为参数传递给Thread类的构造方法来创建线程对象,最后调用线程对象的start()方法来启动线程。 ```java class MyRunnable implements Runnable { public void run() { // 线程的执行逻辑 } } // 创建线程实例并启动线程 MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); ``` 3. 使用匿名内部类:可以直接使用匿名内部类来实现Runnable接口或继承Thread类,并重写其run()方法来定义线程的执行逻辑。然后通过创建匿名内部类的实例并调用start()方法来启动线程。 ```java // 使用匿名内部类实现Runnable接口 Runnable runnable = new Runnable() { public void run() { // 线程的执行逻辑 } }; // 创建线程实例并启动线程 Thread thread = new Thread(runnable); thread.start(); // 使用匿名内部类继承Thread类 Thread thread = new Thread() { public void run() { // 线程的执行逻辑 } }; // 启动线程 thread.start(); ``` 4. 使用线程池:通过使用Java提供的线程池来管理线程的创建和执行。使用Executor框架中的ThreadPoolExecutor类来创建线程池,并submit()方法提交任务给线程池执行。 ```java ExecutorService executor = Executors.newFixedThreadPool(5); Runnable runnable = new Runnable() { public void run() { // 线程的执行逻辑 } }; // 提交任务给线程池执行 executor.submit(runnable); // 关闭线程池 executor.shutdown(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值