JavaSE-多线程

JavaSE多线程 编写一个类,直接继承java. lang. Thread,重写run方法。 阅读详情

多线程

进程:系统资源分配的单位(CPU、磁盘、内存、网络)

线程:独立调度和分配的基本单位,共享进程资源

多线程:一个进程包含多个线程,用来完成不同的工作

进程是为了提高系统资源的利用率和系统吞吐量

线程是为了减少程序在并发执行时付出的时空开销

线程的使用

  1. 继承Thread类
  2. 实现Runnable接口

继承Thread类

构造方法
Thread() #分配一个新的 Thread对象
Thread(String name) #分配一个新的 Thread对象
常用方法
void run()  #如果该线程是使用一个单独的 Runnable运行对象的构造,然后 Runnable对象的 run方法被调用;否则,该方法不返回
void start()  #导致该线程开始执行;java虚拟机调用这个线程的 run方法

声明方式

public class 线程类名 extends Thread{
	//重写run方法
	public void run(){
	}
}

实现Runnable接口

声明方式

public class 线程名 implements Runnable{
	//实现run方法
	public void run(){
	}
}

线程的优先级

默认的线程优先级为5

线程优先级最高为10

线程优先级最低为1

线程优先级指的是一种概率

守护线程

用户线程:User Thread

守护线程:Daemon Thread,主要为其他线程提供服务的,比如垃圾回收线程

守护线程主要是在用户线程都执行玩的情况下执行,如果没有用户线程执行,守护线程自动退出

UserThread类

package com.Thread.util;
/*
 * @author Administrator
 * @version 1.0
 */
public class UserThread implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "--->" + i);
        }
    }
}

DaemonThread类

package com.Thread.util;
/*
 * @author Administrator
 * @version 1.0
 */
public class DaemonThread implements Runnable {
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("我是守护进程,守护到永远");
        }
    }
}

ThreadDemo类

package com.Thread.util;
/*
 * @author Administrator
 * @version 1.0
 */
public class ThreadDemo {
    //主函数
    public static void main(String[] args){
        //初始化用户线程
        UserThread userThread = new UserThread();
        Thread user = new Thread(userThread);
        //设置用户线程的名字
        user.setName("用户线程");
        //初始化守护线程
        DaemonThread daemonThread = new DaemonThread();
        Thread daemon = new Thread(daemonThread);
        //设置线程为守护线程
        daemon.setDaemon(true);
        //设置守护线程的名字
        daemon.setName("守护线程");
        //启动线程
        user.start();
        daemon.start();
        //我是守护进程,守护到永远
		//用户线程--->i
    }
}

线程的同步

(1)同步代码块

synchronized (对象) {
}

(2)同步方法

synchronized修饰的方法

(3)互斥锁

Lock,保证数据的完整性

ReentrantLock类

构造方法

ReentrantLock() #创建 ReentrantLock实例
常用方法
void lock()  #获取锁
void unlock()  #试图释放这个锁

多线程卖票示例

Ticket类

package com.Thread.util;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
 * @author Administrator
 * @version 1.0
 */
public class Ticket implements Runnable{
    //定义成员变量
    private int total;
    //向上转型
    private Lock lock = new ReentrantLock();
    //无参构造方法
    public Ticket(){

    }
    //有参构造方法
    public Ticket(int total){
        this.total = total;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public synchronized void saleTicket(){
        total--;
        System.out.println(Thread.currentThread().getName() + "卖了1张票,还剩" + total + "张票");
    }
    //方法一,同步代码块,同步代码块是一种高开销,尽量减少同步代码块的内容
    @Override
    public void run() {
        while (total > 0){
            //锁机制
            synchronized (this) {
                total--;
                String window = Thread.currentThread().getName();
                System.out.println(window + "卖了1张票,还剩" + total + "张票");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //方法二,同步方法
//    @Override
//    public void run() {
//        while (total > 0){
//            //锁机制
//            saleTicket();
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//    }
    //方法三,互斥锁
//    @Override
//    public void run() {
//        while (total > 0){
//            try {
//                lock.lock();
//                total--;
//                String window = Thread.currentThread().getName();
//                System.out.println(window + "卖了1张票,还剩" + total + "张票");
//            } finally {
//                lock.unlock();
//            }
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//    }
}

SaleTicket类

package com.Thread.util;
/*
 * @author Administrator
 * @version 1.0
 */
public class SaleTicket {
    //主函数
    public static void main(String[] args) {
        //初始化Ticket对象
        Ticket ticket = new Ticket(10);
        //初始化Thread对象
        Thread window1 = new Thread(ticket);
        window1.setName("窗口1");
        Thread window2 = new Thread(ticket);
        window2.setName("窗口2");
        //启动线程
        window1.start();
        window2.start();
    }
}

线程的等待与唤醒

wait:线程等待,知道另一个线程调用该对象的notify()方法或notifyAll()方法

notify:唤醒正在等待对象监视器的单个线程

notifyAll:唤醒正在等待对象监视器的所有线程

sleep:睡眠时间,Thread自带的方法

实现线程的等待与唤醒

(1)匿名内部类
package com.Thread.util;
/*
 * @author Administrator
 * @version 1.0
 */
public class WaitNotify {
    //定义静态成员变量
    private static Object object = new Object();
    //匿名内部类创建唤醒线程
    private static Thread notify = new Thread(){
        @Override
        public void run() {
            synchronized (object){
                object.notify();
                System.out.println(Thread.currentThread().getName() + "调用了notify方法");
            }
            System.out.println(Thread.currentThread().getName() + "释放了锁");
        }
    };
    //匿名内部类创建等待线程
    private static Thread wait = new Thread(){
        @Override
        public void run() {
            synchronized (object){
                try {
                    object.wait();
                    System.out.println(Thread.currentThread().getName() + "在等待");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "被唤醒,获得了锁");
            }
        }
    };
    //主函数
    public static void main(String[] args) {
        //设置线程的名字
        wait.setName("等待线程");
        notify.setName("唤醒线程");
        //启动线程
        wait.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        notify.start();
    }
}
(2)静态内部类
package com.Thread.util;
/*
 * @author Administrator
 * @version 1.0
 */
public class ThreadDemo {
    //定义静态成员变量
    private static Object object = new Object();
    //静态内部类
    static class Thread1 implements Runnable{
        @Override
        public void run() {
            synchronized (object){
                object.notify();
                System.out.println(Thread.currentThread().getName() + "调用了notify方法");
            }
            System.out.println(Thread.currentThread().getName() + "释放了锁");
        }
    }
    //静态内部类
    static class Thread2 implements Runnable{
        @Override
        public void run() {
            synchronized (object){
                try {
                    object.wait();
                    System.out.println(Thread.currentThread().getName() + "在等待");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "被唤醒,获得了锁");
            }
        }
    }
    //主函数
    public static void main(String[] args) {
        //初始化静态对象
        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();
        //初始化等待和唤醒线程
        Thread notify = new Thread(thread1);
        Thread wait = new Thread(thread2);
        //设置线程的名字
        wait.setName("等待线程");
        notify.setName("唤醒线程");
        //启动线程
        wait.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        notify.start();
    }
}

实现线程的依次执行

printNumber方法
private static void printNumber(String threadName) {
    int i=0;
    while (i++ < 3) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(threadName + " print: " + i);
    }
}

主方法

private static void demo2() {
    Thread A = new Thread(new Runnable() {
        @Override
        public void run() {
            printNumber("A");
        }
    });
    Thread B = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("B 开始等待 A");
            try {
                A.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            printNumber("B");
        }
    });
    B.start();
    A.start();
}

//B 开始等待 A
//A print: 1
//A print: 2
//A print: 3
//B print: 1
//B print: 2
//B print: 3

实现线程的执行完再执行

主方法
private static void runDAfterABC() {
    int worker = 3;
    CountDownLatch countDownLatch = new CountDownLatch(worker);
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("D is waiting for other three threads");
            try {
                countDownLatch.await();
                System.out.println("All done, D starts working");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
    for (char threadName='A'; threadName <= 'C'; threadName++) {
        final String tN = String.valueOf(threadName);
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(tN + " is working");
                try {
                    Thread.sleep(100);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(tN + " finished");
                countDownLatch.countDown();
            }
        }).start();
    }
}

//D is waiting for other three threads
//A is working
//B is working
//C is working
//A finished
//C finished
//B finished
//All done, D starts working

实现线程的等待一起执行

主方法
private static void runABCWhenAllReady() {
    int runner = 3;
    CyclicBarrier cyclicBarrier = new CyclicBarrier(runner);
    final Random random = new Random();
    for (char runnerName='A'; runnerName <= 'C'; runnerName++) {
        final String rN = String.valueOf(runnerName);
        new Thread(new Runnable() {
            @Override
            public void run() {
                long prepareTime = random.nextInt(10000) + 100;
                System.out.println(rN + " is preparing for time: " + prepareTime);
                try {
                    Thread.sleep(prepareTime);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    System.out.println(rN + " is prepared, waiting for others");
                    cyclicBarrier.await(); // 当前运动员准备完毕,等待别人准备好
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(rN + " starts running"); // 所有运动员都准备好了,一起开始跑
            }
        }).start();
    }
}

//A is preparing for time: 4131
//B is preparing for time: 6349
//C is preparing for time: 8206
//A is prepared, waiting for others
//B is prepared, waiting for others
//C is prepared, waiting for others
//C starts running
//A starts running
//B starts running

实现线程的子线程执行与回传

主方法
private static void doTaskWithResultInWorker() {
    Callable<Integer> callable = new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            System.out.println("Task starts");
            Thread.sleep(1000);
            int result = 0;
            for (int i=0; i<=100; i++) {
                result += i;
            }
            System.out.println("Task finished and return result");
            return result;
        }
    };
    FutureTask<Integer> futureTask = new FutureTask<>(callable);
    new Thread(futureTask).start();
    try {
        System.out.println("Before futureTask.get()");
        System.out.println("Result: " + futureTask.get());
        System.out.println("After futureTask.get()");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

//Before futureTask.get()
//Task starts
//Task finished and return result
//Result: 5050
//After futureTask.get()

线程池

概述

多个线程运行时运行机制,包括排队策略,包括线程存活时间,框架策略,管理,创建,释放

构造方法

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) #创建具有给定的初始参数和默认线厂和拒绝执行处理程序的一个新的 ThreadPoolExecutor

corePoolSize:核心池

maximumPoolSize:线程池最大线程数

keepAliveTime:线程没有任务执行时,最多多长时间会终止。大于corePoolSize才起作用

TimeUnit :keepAliveTime的时间单位

workQueue:用于存放待执行的任务(ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等)

常用方法

void execute(Runnable command)  #在未来的某个时候执行给定的任务
void submit(Runnable task) #一个即将完成的任务的未来
void shutdown()  #启动一个有序的关机,在以前提交的任务被执行,但没有新的任务将被接受
List<Runnable> shutdownNow()  #试图阻止所有积极执行任务,停止等待任务的处理,并返回一个列表,正在等待执行的任务

MyTask类

package com.Thread.util;
/*
 * @author Administrator
 * @version 1.0
 */
public class MyTask implements Runnable{
    //工作任务数
    private int taskNum;
    //无参构造方法
    public  MyTask(){

    }
    //有参构造方法
    public MyTask(int taskNum){
        this.taskNum = taskNum;
    }
    @Override
    public void run() {
        System.out.println("正在执行的任务" + taskNum);
        try {
            Thread.sleep(2000);
            System.out.println("task" + taskNum + "finished!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public int getTaskNum() {
        return taskNum;
    }

    public void setTaskNum(int taskNum) {
        this.taskNum = taskNum;
    }
}

ThreadPoolTest类

package com.Thread.util;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/*
 * @author Administrator
 * @version 1.0
 */
public class ThreadPoolTest {
    //主函数
    public static void main(String[] args) {
        //初始化线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10,15,1000, TimeUnit.MICROSECONDS,new ArrayBlockingQueue<Runnable>(5)
        );
        //模拟线程的工作机制
        for (int i = 0; i < 20; i++) {
            //新建一个任务
            MyTask myTask = new MyTask(i);
            //往线程中添加任务
            threadPoolExecutor.execute(myTask);
            System.out.println("线程池中的线程数目:"+threadPoolExecutor.getPoolSize()+"队列中等待的任务数"+threadPoolExecutor.getQueue()
            +"已执行完成的任务数目"+threadPoolExecutor.getCompletedTaskCount());
        }
        //关闭线程池
        threadPoolExecutor.shutdown();
    }
}
JavaSE-多线程知识 阅读详情

相关推荐

03 Aras Innovator二次开发-服务端方法(二)

Aras Innovator二次开发-服务端方法书写

企业信息化(PLM,ERP.MES) 2017

JavaSE多线程笔记

javase多线程笔记

cc_1113的博客 917

如何检查你的系统是否支持 TPM 2.0

TPM 2.0 是 Windows 11 的硬性要求,作为安全加密芯片,用于存储密钥、认证信息,提升系统安全性。它可防止数据窃取,支持 BitLocker 等功能。多数现代主板已集成 TPM,但需在 BIOS 中启用。可通过 tpm.msc、PowerShell 或微软 PC 健康检查工具验证支持情况。部分设备采用固件实现的 fTPM/PTT,无需独立芯片。

山岚的运维笔记 118

JavaSE——多线程

首先要弄明白一点,不等于操作系统级别的线程,Java创建的线程是Java虚拟机管理的,是。提供了统一的API,屏蔽了不同操作系统的差异性。操作系统级别的线程是由操作系统内核直接管理和调度的实体。它们是 CPU 调度的基本单位。现代 JVM 实现中,,即所谓的。ThreadC语言创建的线程,才是真正意义上的操作系统上的线程。但是C语言在类Unix使用pThread来创建线程,但是在Windows使用的是Win32 API。所以。

weixin_69032308的博客 1072

后向投影算法(BPA)-SAR成像算法系列(二)

SAR成像算法:后向投影算法(BPA)原理介绍及实现步骤解析。

yjh_2019的博客 1万+

搭建云平台 1 Day 虚拟机安装(超详细)

点击OFF 那个按钮看看网络的地址和速度有没有显示,如果有 则到目前为止都是成功的。Host name随便起一个名字就行了**-_-**文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**,如果我们安装的VMware14就会默认为。因为我的是VMware16,所以默认。也是可以的,但是千万不要用。

2401_84009679的博客 563

JavaSE多线程《二》

JavaSE多线程《一》回顾 三·多线程的常用操作方法 3.1 线程的命名于取得命名 多线程的运行状态是不确定的,所以对于多线程操作必须有一个明确标识出线程对象的信息,这个信息往往通过名称来描述。在Thread类中提供有如下的线程名称方法: 要想取得线程的对象,在Thread类中提供有一个方法取得当前线程对象: /** * Returns a reference to the currently...

LeBronJJJ的博客 235

YOLOv5 实现 10 种热力图可视化方式教程 | GradCAM XGradCAM ScoreCAM LayerCAM HiResCAM EigenCAM......

10 种热力图可视化方法 ,总有一款适合你

Coding... 5571

JavaSE多线程《三》

往期回顾: JavaSE多线程《一》 JavaSE多线程《二》 3.5 线程停止 多线程中有三种方式可以停止线程。 设置标记位,可以使线程正常退出。 使用stop方法强制使线程退出,但是该方法不太安全所以已经被废弃了。 使用Thread类中的一个 interrupt() 可以中断线程。 首先示例,利用设置标记为flag 使线程停止: 代码如下: package com.revisi...

LeBronJJJ的博客 237

【工具篇】万字长文拆解 Otter.ai:语音转文字领域的「瑞士军刀」是如何炼成的?(附保姆级教程)

但需要注意,2024年欧盟已出台《AI转录伦理指南》,要求所有录音需获得参与者明确授权。举个真实案例:某硅谷创业团队用Otter.ai记录产品评审会,系统自动标红争议点并生成待办事项,会议效率提升40%。AIGC技术原理、 实时转录解析、 定价策略分析、 语音算法拆解、 多平台兼容测试、 深度学习框架、 空间计算专利。——无论是跨国会议、课堂讲座还是深夜灵感,它都能实时生成带时间戳的文本记录,准确率高达95%。(此处建议插入Otter.ai会议转录动图,展示实时字幕生成效果)(数据来源:综合参考文献整理)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1262

Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程

本文主要介绍了Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程,希望能对使用Codex的同学们有所帮助。 文章目录 1. 背景 2. 实战教程

weixin_43178406的博客 6万+

JavaSE后阶(多线程)

Java多线程

2401_85776998的博客 1079

手把手教你学Simulink--基于飞行控制与稳定性的场景实例:固定翼无人机的自动起飞与降落控制

本文介绍了使用Simulink对固定翼无人机自动起飞与降落控制系统进行建模与仿真的完整流程。首先构建了包含飞行器动力学模型、控制系统、环境模拟等模块的系统结构,详细阐述了简化动力学方程的推导和实现。重点讲解了PID控制器设计,包括起飞阶段的速度控制和降落阶段的高度控制策略。通过添加环境干扰和输入信号,建立了完整的仿真模型,并利用输出显示模块评估系统性能。该实例为无人机自主控制系统的开发提供了有效的仿真验证方法,有助于优化参数提高飞行稳定性。

MHD0815的博客 4315

JavaSE_10多线程

JavaSE_10多线程

圆静居士的专栏 347

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JavaSE基础:多线程

JavaSE基础:多线程 文章目录JavaSE基础:多线程前言一、基本概念1、什么是进程?什么是线程?2、java程序中的线程3、进程和线程的关系4、对于单核的CPU来说,真的可以做到真正的多线程并发吗?5、实现线程的两种方式6、线程对象的生命周期二、线程的调度和数据安全1、常用的线程调度模型2、有关线程调度的方法3、数据安全(重点)4、存在安全问题的三个条件5、解决线程安全问题6、异步和同步编程模型7、三大变量的线程安全问题8、局部变量的使用9、synchronized三种写法三、守护线程1、概念2、例子

weixin_44675404的博客 493

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JavaSE总结 多线程 网络编程

JavaSE多线程 多线程

天上飞的云传奇 365

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JavaSE超详细笔记-多线程篇-基于黑马

假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。他的作用就是去调用main方法,并执行里面的代码,之前在main方法里的代码,其实都是运行在main线程当中。接下来,以线程基础,线程优先级,守护线程,礼让线程,插入线程的几个角度去拆分。

超级苦力怕的博客 1257

JavaSE多线程之线程种类

JavaSE多线程之线程种类 1.线程控制之休眠线程 A:线程休眠: public static void sleep(long millis) 线程休眠 B:案例演示: 线程休眠 2.线程控制之加入线程 A:加入线程: public final void join() 意思就是: 等待该线程执行完毕了以后,其他线程才能再次执行 注意事项: 在线程启动之后,在调用方法 B:案例演示: 加入线程 ![在这里插入图片描述](https://img-blog.csdnimg.cn/202006050746

ITzhazhassc的博客 192

Javase学习复习D16[多线程]

主线程 : CPU和内存之间开辟的转门为main方法服务的线程指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁根据上图所示:线程1正在持有锁1,但是线程1必须再拿到锁2,才能继续执行而线程2正在持有锁2,但是线程2需要再拿到锁1,才能继续执行此时两个线程处于互相等待的状态,就是死锁,在程序中的死锁将出现在同步代码块的嵌套中当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。

ysy1648067239的博客 1050

JavaSE(多线程和线程池)知识点总结

​ 线程就是操作系统能够进行运算调度的最小单位,它被包含在进程(进程是程序的基本执行实体,任务管理器种选择的进程就可以看到每个软件的进程)中,是进程中实际运作的单位。​ 比如:360杀毒软件,包括木马查杀、电脑清理、系统修复功能。其中360杀毒软件就是进程,其中的功能就是线程。​ 简单理解:应用软件种相互独立,可以同时运行的功能就是线程。

weixin_46119796的博客 1745

[JavaSE学习笔记] 多线程

定义一个线程任务类实现Runnable接口,重写run()方法,创建该任务类对象,将该对象交给Thread的有参构造器,调用线程对象的start启动线程。Lock锁是JDK5开始提供的新的锁定操作,Lock是一个接口,提供了lock和unlock两种方法,通过它可以创建出锁对象进行加锁和解锁,更加灵活强大。每次只允许一个线程进入代码块,此时上锁,其他线程无法进入该代码块,当进入对象执行完毕后,锁解开。其底层原理也是同步代码块,只不过代码块范围是整个方法,同样也有锁对象,只不过被隐藏了。

qq_58547683的博客 1107

【JavaSE】多线程之Thread类(下)

前面我们了解了Thread类中的常用属性,本节我们来介绍Thread相关的方法以及几种基本的线程操作。

stillaliveQEJ的博客 1015

JavaSE多线程之卖电影票案例

JavaSE多线程之卖电影票案例 1.继承Thread类的方式卖电影票 A:案例演示 需求:某电影院目前正在上映贺岁大片,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售票。 通过继承Thread类实现 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020060620085618.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6L

ITzhazhassc的博客 1858

JavaSE 总复习:语法到多线程全梳理

JavaSE 高效复习指南(150字摘要) 本文提出结构化复习JavaSE的方法,强调从问题解决角度切入而非死记API。将JavaSE划分为12个核心模块,每个模块明确其解决的问题:基础语法构建代码基础,面向对象组织代码结构,集合管理数据,IO处理文件读写,多线程实现并发等。复习重点包括:掌握最小实现代码、识别常见错误、设计自测方案。特别提醒关注面向对象、集合、IO和多线程等核心模块,同时注意JDK版本差异。文章采用"问题导向+代码实践"的方式串联知识点,并提供详细笔记链接供深入查阅。 (150字)

一个持续进化的java+ai学习者博客:AI Agent 工具链(Codex、Harness、Claude Code、MCP、Skills)实战笔记 + 后端开发教程,每周稳定更新。 4925
上一篇: JavaSE-IO流
下一篇: JavaSE-反射
JP-Destiny
博客等级 码龄8年 34粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值