{多线程的目的:更好的利用cpu资源,所有的多线程都是由单线程实现的}
线程的概述
【多线程高并发】
多线程 提高性能 一个进程可以有多个线程 进程是程序执行的一次过程,它是一个动态概念
【main】 主线程 线程是独立执行的路径
程序在运行时,即使没有启动线程,后台也有线程
对于用一份资源操作时,会存在资源抢夺问题 ,需要加并发控制
线程也会带来额外的开销,cpu调用时间
线程的创建
{
继承Thread类
start()方法能够异步调用run
run()是同步的;无法达到线程的目的
}
{
实现Runnable接口
}
{
实现Callable接口
实现步骤:
实现Callable接口,需要返回值类型
重写call方法,需要抛出异常
创建目标对象
创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
提交执行:Future result1 = ser.submit(11);
获取结果:boolean r1 = result1.get()
关闭服务:ser.shutdownNow();
Note:创建执行服务的代码意味创建线程池,有几个线程,数字就应是几
}
{线程池创建}
代理对象
//静态代理
public class Proxy {
public static void main(String[] args) {
You you = new You();
Ta ta = new Ta(you);
ta.eat();
}
}
interface gongog {
void eat();
}
//真实对象
class You implements gongog {
@Override
public void eat() {
System.out.println("我正在.....");
}
}
//代理对象
class Ta implements gongog {
//角色
private gongog target;
public Ta(gongog target) {
this.target = target;
}
@Override
public void eat() {
Before();
this.target.eat();
after();
}
private void Before() {
System.out.println("之前.....");
}
private void after() {
System.out.println("之后");
}
}
现成的状态{
创建状态 > 就绪状态 > 阻塞状态 > 运行状态 > 死亡状态
线程休眠
sleep(时间) 指定当前线程阻塞的毫秒数
sleep 存在异常 InterruptedException
sleep 时间达到后 线程进入就绪状态
sleep 可以模拟网络延时,倒计时等
线程停止
//测试stop
//1.建议线程正常停止--->利用次数,不建议死循环
//2.建议使用标志位--->设置一个标志位
//3.不要使用stop或者destroy等过时或者JDK不建议使用的方法
public class TestStop implements Runnable {
//1.线程中定义线程体使用的标识
private boolean flag = true;
@Override
public void run() {
int i = 0;
//2.线程体使用该标识
while(flag){
System.out.println("run...Thread" + i++);
}
}
//3.对外提供一个公开的方法改变标识
public void stop(){
this.flag = false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for (int i = 0; i < 100; i++) {
System.out.println("main" + i);
if(i == 50){
//调用stop方法切换标志位,让线程停止
testStop.stop();
System.out.println("线程该停止了");
}
}
}
}
倒计时
public static void main(String[] args) {
//获取系统当前时间
Date date = new Date(System.currentTimeMillis());//系统当前时间
while (true) {
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(date));
date = new Date(System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
线程礼让 yield
不一定成功看cup性能
//线程礼让不一定成
public class TestYield {
public static void main(String[] args) {
NyYield nyYield = new NyYield();
new Thread(nyYield, "a").start();
new Thread(nyYield, "b").start();
}
}
class NyYield implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "线程执行");
Thread.yield();//礼让线程
System.out.println(Thread.currentThread().getName() + "线程停止");
}
}
每个对象都有一把锁,sleep不会释放锁
插队
new Thread().join();//插队
线程的优先级
getPriority() . setPriority(int xxx)
守护线程
Thread thread = new Thread(god); thread.setDaemon(true); //默认是false表示是用户线程,
正常的线程都是用户线程
thread.start(); //守护线程启动
同步方法
synchronized在方法中
同步快
synchronized (变化量){}
//锁的对象就是变化的量,需要增删改的对象
//死锁:多个线程互相占着对方需要的资源,然后形成僵持
synchronized 与Lock
Lock是显示锁 synchroized 隐式锁
Lock只有代码块,synchroized有代码锁和方法锁
使用Lock锁,jvm花费较少的时间来调度线程,有更好 的扩展性
优先顺序
Lock> 同步代码块 >同步方法
线程池
Runnable Callable 工具类 Executor
提高响应速度,降低资源消耗;便于管理
//1.创建服务,创建线程池
//newFixedThreadPool 参数为:线程池大小
ExecutorService service = Executors.newFixedThreadPool(10);
//2.关闭连接 service.shutdown();