黑马程序员----------------JAVA基础线程

来源:互联网 发布:win10 不允许下载软件 编辑:程序博客网 时间:2024/05/16 07:28
多线程概述
进程:
正在运行的程序,是系统进行资源分配和调用的独立单位。
每一个进程都有它自己的内存空间和系统资源。
线程:
是进程中的单个顺序控制流,是一条执行路径
一个进程如果只有一条执行路径,则称为单线程程序。
一个进程如果有多条执行路径,则称为多线程程序。
简单说Thread: 线程:


进程:正在运行的应用程序

线程:进程中的一条执行路径


单线程: 应用程序只有一条执行路径
多线程: 应用程序有多条执行路径




创建线程对象的两种方式
方式1: 继承Thread
a: 自定义类 继承 Thread
b: 重新Thread类中的run()方法
c: 创建自定义类对象(线程对象)
d: 启动线程? start()方法

方式2: 实现Runnable
a: 自定义类  实现 Runnable
b: 实现接口中的run()方法
c: 创建自定义类对象
d: 创建Thread对象,然后把自定义类对象 作为构造方法的参数使用
e: 开启线程, start()方法
start() 与 run() 区别?
 
  public void run(): 每个线程要执行的操作代码
  public void start(): 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 
 
  run()直接调用,普通方法的使用,没什么意义
  start(),启动一个线程,并调用该线程对象中的run方法




Thread类中方法:
public final String getName()返回该线程的名称。
public final void setName(String name)改变线程名称,使之与参数 name 相同。
public static Thread currentThread()返回对当前正在执行的线程对象的引用。
 后台线程:
public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。
当正在运行的线程都是守护线程时,Java 虚拟机退出
中断线程:
public final void stop() 停止
结束当前正在运行的线程
public void interrupt() 中断
InterruptedException:
中断当前正在运行的线程, 抛出一个中断异常,而运行还可以运行

线程优先级
public final int getPriority()返回线程的优先级。
public final void setPriority(int newPriority)更改线程的优先级。
public static final int MAX_PRIORITY 10  最大优先级
public static final int MIN_PRIORITY 1 最小优先级 
public static final int NORM_PRIORITY 5 默认优先级 
线程休眠
public static void sleep(long millis)让线程对象 休眠给定的毫秒值,当时间到后,继续运行
线程加入
public final void join() 等待该线程终止,当该线程结束后,才会执行其他线程
线程礼让
public static void yield()




同步机制:
首先想为什么出现问题?(也是我们判断是否有问题的标准)
是否是多线程环境
是否有共享数据
是否有多条语句操作共享数据
如何解决多线程安全问题呢?
基本思想:让程序没有安全问题的环境。
怎么实现呢?
把多个语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可。


解决多线程安全问题
   
同步代码块
格式:
synchronized (锁对象) {
需要同步的代码
}

同步方法
(普通同步方法)
(静态同步方法)
格式:
修饰符 synchronized 返回值类型 方法名(参数列表){....}

注意:
同步代码块,如果有多个同步代码块,那么锁对象,要求一致
同步方法,同步方法的锁对象是谁?  this
同步方法,同步静态方法的锁对象是谁?  字节码文件对象, 类名.class


将线程不安全的集合, 变为 线程安全的集合
  
  Collections: 集合工具类
  
  方法:
  public static <T> Collection<T> synchronizedCollection(Collection<T> c)
  public static <T> List<T> synchronizedList(List<T> list)
  public static <T> Set<T> synchronizedSet(Set<T> s)
  public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)


    


 

0 0