多线程

115 阅读2分钟

多线程

  1. 线程的创建和使用
  2. 线程的生命周期
  3. 线程的同步
  4. 线程的通信
线程的创建与使用

程序、进程、线程

程序:为了完成某种任务或功能、用某种语言编写的一组命令的集合

进程:正在运行的一个程序

线程:进程的进一步细化,是程序内部的执行路径

线程的创建与使用:

创建多线程有两种办法:

方式一、继承Thread类

创建继承于Thread类的方法----> 重写run()方法-----> 创建Thread类对象-----> 通过对象调用start()方法
 

方式二、实现runnable接口

 创建实现runnable接口的类----> 实现run()方法-----> 创建Thread类对象-----> 将实现类作为参数放进Thread类构造器----->通过Thread类实例调用start方法 
 

给主线程命名

Thread01.currentThread().setName("目前是主线程");
线程的优先级设置
  • 设置/设置优先级:set/getpriority()
    
  •  设置线程优先级,要在start方法前设置
    
  • 线程优先级最大为10,最小为1,默认是5
    
runnable接口的线程安全问题

安全问题举例:编写一个模拟卖票的程序,开启了三个线程售票并输出票号,有一定概率出现重号、错号的现象

原因:当一个线程正在操作操作还未完成时,其他线程参与进来

解决办法:

    1、同步代码块(操作共享数据的代码,就是需要被同步的代码)
    使用synchronized(同步监视器){
            //需要被同步的代码
        }
    同步监视器,俗称“锁”,任何一个类的对象,都可以充当锁
    要求:多个线程必须同用一把锁
    
    2、同步方法:将操作共享数据的代码声明在一个方法中,这个方法就是同步方法
    
        
Thread类的线程安全问题
 1、同步代码块(操作共享数据的代码,就是需要被同步的代码)
    使用synchronized(同步监视器){
            //需要被同步的代码
        }
由于继承的方式需要创建多个对象,所以锁需要是静态的。
或者 锁可以使用当前对象this充当(慎用)

2、同步方法
Thread类由于会创造多个对象,所以同步方法要写成:
public static synchronized void 方法名(){
            //共享数据的代码
        }