概念
程序:一段静态的代码
进程:运行中的程序 进程作为资源分配的单位
线程: 进程进一步细化为线程,是一个程序内部的一条执行路径
实现方式
继承thread
- 创建一个继承Thread的子类
- 子类中重写父类的run()方法
- 创建子类的对象
- 通过 子类对象.start() 启动线程
实现runable接口
- 创建一个实现了runnable接口的类
- 实现类中实现run()方法
- 创建实现类对象
- 创建Thread类对象,并将实现类对象作形参传入构造器 new Thread(实现类对象);
- 通过Thread类对象 调用 start()启动线程
实现Callable接口
- 创建一个Callable的实现类
- 实现类中重写call()方法
- 创建该实现类的对象
- 将实现类对象作FutureTask 类构造器的传数,创建FutureTask类对象
- 将FutureTask对象作参数传递到Thread类的构造器中,创建Thread类对象,并调用start()启动线程
- 调用FutureTask类对象的get()方法获取返回值
线程池
- 创建线程池
ExecutorService service = Executors.newFixedThreadPool(10); - 执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象
service.execute(new NumberThread());//适合适用于Runnable
service.execute(new NumberThread1());//适合适用于Runnable - 关闭连接池
service.shutdown(); - 设置线程池属性
先转
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 阴塞的线程。
标签:Thread,对象,创建,实现,线程,子类,多线程 From: https://www.cnblogs.com/DTCLOUD/p/17483222.html作者:杨洋