多线程的理解

文章详细介绍了多线程的目的,如更好地利用CPU资源,以及线程的创建和管理,包括继承Thread类、实现Runnable和Callable接口。还提到了线程池的使用,如ExecutorService,以及线程状态、同步机制、死锁和锁的概念。此外,文章还讨论了线程的礼让、优先级和守护线程等主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

{多线程的目的:更好的利用cpu资源,所有的多线程都是由单线程实现的}

线程的概述

【多线程高并发】

多线程 提高性能  一个进程可以有多个线程   进程是程序执行的一次过程,它是一个动态概念

【main】 主线程   线程是独立执行的路径

程序在运行时,即使没有启动线程,后台也有线程 

 对于用一份资源操作时,会存在资源抢夺问题 ,需要加并发控制

线程也会带来额外的开销,cpu调用时间

线程的创建

{

继承Thread类

https://i-blog.csdnimg.cn/blog_migrate/a50c52a34f8ff38653f95cf95c22c3e9.png

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值