多线程(一)

多线程

概念

  • 并发执行多个线程。

特点

  • 多个线程之间交替执行。
  • 每个线程执行的时间和顺序是随机的。

并发、并行

  • 并发:在同一时刻,多个指令在多个CPU上同时执行。
  • 并行:在同一时刻,多个指令在单个CPU上交替执行。

进程、线程

  • 进程:操作系统中正在运行的一个应用程序。
  • 线程:应用程序中做的事情。

多线程的实现方式

继承Thread类的方式进行实现
  • 定义一个MyThread类继承Thread类;
  • 在MyThread类中重写run()方法;
  • 创建MyThread类的对象;
  • 启动线程。
    注意
  • 为什么重写run方法?
    • run()用来封装被线程执行的代码。
  • fun()方法和start()方法的区别?
    • run():封装线程执行的代码,直接调用相当于普通方法的调用,没有开启线程。
    • start():启动线程,由JVM调用此线程的run()方法。
实现Runnable接口的方式进行实现
  • 定义MyRunnable类实现Runnable接口;
  • 在MyRunnable类中重写run()方法;
  • 创建MyRunnable类的对象;
  • 创建Thread类的对象,把MyRunnable对象作为构造方法的参数;
  • 启动线程。
利用Callable和Future接口方式
  • 定义一个类实现Callable接口
  • 在类中重写call()方法
  • 创建类的实例化对象
  • 创建Future的实现类FutureTask对象,把对象作为构造方法的参数
  • 创建Thread类的对象,把FutureTask对象作为构造方法的参数
  • 启动线程
  • 调用get()方法,可以获取线程结束之后的结果

获取和设置线程名称

获取线程名字
String getName();	// 返回此线程的名称
Thread类中设置线程的名字
void setName(String name);	// 将此线程的名字更改为name
  • 通过构造方法也可以设置线程名称

获得当前线程对象

public static Thread currentThread();	// 返回对当前正在执行的线程对象的引用

线程休眠

public static void sleep(long time);	// 让线程休眠指定的时间,单位为毫秒

线程调度

线程的优先级
public final void setPriority(int newPriority);	// 设置线程的优先级
public final int getPriority();	// 获取线程的优先级

守护线程(后台线程)

  • 当普通线程执行完毕之后,守护线程也没有继续执行下去的必要了
public final void setDaemon(boolean on);	// 设置为守护线程

同步代码块

  • 锁多条语句操作共享数据,可以使用同步代码块实现。
synchronized(任意对象){
    // 多条语句操作共享数据的代码
}

注意

  • 锁可以是任意对象
  • 多个线程之间必须共用一把锁
  • 一般可以使用类名.class作为锁
  • 默认情况是打开的,只要有一个线程进去执行代码了,锁就会关闭
  • 当线程执行完出来了,锁才会自动打开

同步的好处和弊端

  • 好处:解决了多线程的数据安全问题
  • 弊端:当线程很多时,耗费资源,降低程序运行效率。

同步方法

  • 就是把synchronized关键字加到方法上

格式:

修饰符 synchronized 返回值类型 方法名(方法参数){ }
  • 同步方法锁的对象是this

同步静态方法

修饰符 static synchronized 返回值类型 方法名(方法参数){ }
  • 同步静态方法锁的对象是类名.class
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页