Java_多线程知识总结01

首先,先看一下进程与线程的概念:

1、进程与线程

1.1 进程与线程的概念

   进程:操作系统中一个程序的执行周期就叫做进程。

   线程:一个进程同时执行多个任务,一个任务就是一个线程。

1.2 进程与线程的关系:

  • 与进程相比,线程更加“轻量级”,创建、撤销一个线程比启动、撤销一个进程的开销要小的多,一个进程中的所有线程共享此进程中的所有资源
  • 没有进程就没有线程,进程一旦终止,其内的线程也将不复存在
  • 进程是操作系统资源调度的基本单位,进程可以独享资源;
  • 线程需要依托进程提供的资源,无法独立申请操作系统资源,线程是任务调度和执行的基本单位。

2、多线程的实现

多线程的实现的三种常用方法三种方法:

1.继承Thread类实现
2.实现Runnable接口实现
3.实现Callable接口实现

在这里要注意以下两点:

  • 不管是哪一种方法实现多线程,线程启动必须是通过调用Thread类提供的start() 方法。
  • 线程start()方法只能调用一次,否则会产生线程状态异常(java.lang.IllegalThreadStateException)

现在就分别来看看这三种方法:

2.1 继承Thread类实现多线程

java.lang.Thread 是一个线程核心类,新建一个线程最简单的方法就是通过实现Thread类然后覆写其run()方法实现多线程。

其中run()方法中就写你实际要干的什么事

范例:
在这里插入图片描述

运行结果展示:
在这里插入图片描述

2.2 实现Runnable接口实现多线程

Thread类的核心功能是进行线程的启动。如果一个类为了实现多线程直接去继承Thread类就会有单继承局限。在java中又提供有另外一种实现模式:Runnable接口。我们先来观察一下Runnable接口:
在这里插入图片描述

通过观察发现:实现Runnable接口实现多线程和继承Thread类一样,也是通过覆写run方法来实现的。

但是如果使用了Runnable接口,就不能调用start方法了,这是我们可以通过Thread类的构造方法:
在这里插入图片描述
传一个Runnable对象类调用start方法,范例如下:
在这里插入图片描述

Thread类与Runnable接口的关系:
  1. 从形式上看,Runnable接口可以解决Thread类的单继承局限
  2. 通过Thread类的定义,可以看出Thread类实际上也是实现了Runnable接口,然后覆写了它的run方法。

在这里插入图片描述

  1. 使用Runnable接口可以更好的实现Thread的共享事件
    例子如下。模拟实现多线程买票:
    在这里插入图片描述
    运行结果:
    在这里插入图片描述
    这几个线程同时卖这几张票,如果是实现Thread类来实现多线程,就是几个线程各卖各的票。

2.3 实现Callable接口实现多线程

Runnable中的run()方法没有返回值。但是很多时候需要一些返回值,例如某些线程执行完成后可能带来一些返回结果,这种情况下就只能利用Callable来实现多线程。

java中从JDK1.5开始追加了新的开发包:java.uti.concurrent。这个开发包主要是进行高并发编程使用的,包含很多在高并发操作中会使用的类。在这个包里定义有一个新的接口Callable
在这里插入图片描述

通过覆写Callable接口中的call方法。实现多线程。

那么使用Callable接口如何调用Thread类的get方法呢???
在这里插入图片描述
范例如下:
在这里插入图片描述

3,线程的常用操作方法

3.1 线程的命名与取得

在Thread类中,提供了一下操作方法:

3.1.1 构造方法设置线程名称:
public Thread(Runnable target, String name)
//在创建线程的时候设置线程名称

例子:
在这里插入图片描述

3.1.2 普通方法设置线程名称方法
public final synchronized void setName(String name) 
//设置线程名称

在这里插入图片描述

3.1.3 普通方法获取线程名称
public final String getName() 
//获取线程名称

使用方法:

 System.out.println(Thread.currentThread().getName());
 //获取当前线程的名称

3.2 线程休眠 — sleep方法

线程休眠:指的是让线程暂缓执行,等到预计之间之后再恢复执行
线程休眠是从运行态到阻塞态,休眠结束后在从阻塞态回到就绪态

 public static native void sleep(long millis) throws InterruptedException;

使用方法:

Thread.sleep(休眠时间);
//其中休眠时间单位为毫秒

在这里插入图片描述

注意:
   线程休眠会交出CPU(立即交出CPU),让CPU去执行其他的任务。但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象

3.3 线程让步方法 — yield () 方法

线程让步:暂停当前执行对象,并执行其他线程
线程让步是从运行态直接到就绪态

yield方法会让当前线程交出CPU,同样不会释放锁,但是yield方法无法控制交出CPU的具体时间,并且只能让拥有相同优先级的线程有获取CPU的机会。

3.4 join方法

join方法:等待该线程终止。意思就是如果在主线程中调用该方法时就会让主线程休眠,让调用该方法的线程run方法先执行完毕之后在开始执行主线程。

例子:
在这里插入图片描述
看看运行结果:
在这里插入图片描述

最后,在补充一下线程的几种状态:
在这里插入图片描述

3.5 线程停止方法

1)通过手动设置标志位停止线程

在这里插入图片描述

运行结果:
在这里插入图片描述

2) 通过调用stop方法停止线程

在这里插入图片描述

执行结果:
在这里插入图片描述
但是这种方法不安全,从代码中可以看出,stop 上有一条删除线,表示此方法已经被@deprecated。

3)使用interrupt方法使线程停止

interrupt方法使用是要分两种情况

  1. 若方法中没有使用sleep、join、wait等方法,interrupt方法会将线程的中断状态置为true,然后可以通过线程中断状态来控制线程停止

在这里插入图片描述

  1. 若方法中使用了sleep、join、wait等方法,那么线程的中断状态会被重新置为false,并抛出一个中断异常(InterruptedException),此时可以通过try…catch块控制线程停止(在catch块中返回)。若方法中使用了sleep、join、wait等方法,那么线程的中断状态会被重新置为false,并抛出一个中断异常(InterruptedException),此时可以通过try…catch块控制线程停止(在catch块中返回)。

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值