多线程

86 阅读3分钟

概念

程序:一段静态的代码 进程:运行中的程序 进程作为资源分配的单位 线程: 进程进一步细化为线程,是一个程序内部的一条执行路径

实现方式

继承thread

  1. 创建一个继承Thread的子类
  2. 子类中重写父类的run()方法
  3. 创建子类的对象
  4. 通过 子类对象.start() 启动线程

实现runable接口

  1. 创建一个实现了runnable接口的类
  2. 实现类中实现run()方法
  3. 创建实现类对象
  4. 创建Thread类对象,并将实现类对象作形参传入构造器 new Thread(实现类对象);
  5. 通过Thread类对象 调用 start()启动线程

实现Callable接口

  1. 创建一个Callable的实现类
  2. 实现类中重写call()方法
  3. 创建该实现类的对象
  4. 将实现类对象作FutureTask 类构造器的传数,创建FutureTask类对象
  5. 将FutureTask对象作参数传递到Thread类的构造器中,创建Thread类对象,并调用start()启动线程
  6. 调用FutureTask类对象的get()方法获取返回值

线程池

  1. 创建线程池 ExecutorService service = Executors.newFixedThreadPool(10);
  2. 执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象 service.execute(new NumberThread());//适合适用于Runnable service.execute(new NumberThread1());//适合适用于Runnable
  3. 关闭连接池 service.shutdown();
  4. 设置线程池属性 先转 ThreadPoolExecutor service1 = (ThreadPoolExecutor) service; service1.setCorePoolSize(15); //设置线程数 service1.setKeepAliveTime(); //线程没有任务时最多保持多长时间会终止 service1.maximumPoolSize() //最大线程数

优先选择

实现runnable接口的方式 实现方式没有类的单继承性的局限性 在多线程的情况时可以将当前对象当作锁

常用方法

start() 启动线程,并执行对象的run()方法 run() 线程在被调度时执行的操作 getName() 获取线程的名称 setName() 设置线程的名称 currentThread() 返回执行当前代码的线程 类拟this yield() 释放当前cpu的执行权(其实没什么软用) join() 在线程a中调用线程b的join方法,线程a会被阻塞,直到线程b彻底结束才会结束阻塞 sleep() 线程阻塞 isAlive() 判断当前线程是否还存活

线程的优先级:

  • 获取优先级 getPriority()
  • 设置优先级 setPriority()
  • 常量 Thread.MAX_PRIORITY:10 Thread.MIN_PRIORITY:1 Thread.NORM_PRIORITY:5 -->默认优先级

线程的生命周期

新建:线程子类被构造 就绪: 调用start()之后 运行: run()方法中代码被 执行 阻塞: sleep()线程阻塞 死亡: 线程结束了它的全部工作

synchronized

实现方式

同步代码块 (指定锁) 同步方法 (非静态方法默认使用this 静态方法使用当前类)

Lock

java.util.concurrent.locks.ReentrantLock 在这个包中 new ReentrantLock(); 这个对象 .lock() 加锁 unlock() 释放锁

线程通信

wait(): 当前线程进入阻塞状态,并释放锁 notify(): 唤一个被 wait阻塞的线程。如果有多个则唤醒优先级最高的 notifyAll(): 唤醒所有被wait 阴塞的线程。

作者:杨洋