Java线程进程必备知识

Java多线程面试题(面试必备) 能力有限,初级菜??,多线程可是一块庞大的知识块,慢慢总结吧! 文章目录 一、多线程基础基础知识 1. 并发编程 1.1 并发编程的优缺点 1.2 并发编程的三要素 1.3 并发和并行有和区别 1.4 什么是多线程,多线程的优劣? 2. 线程与进程 2.1 什么是线程与进程 2.2 线程与进程的区别 2.3 用户线程与守护线程 2.4 什么是线程死锁 2.5 形成死锁的四个必要条件 2.6 如何避免死锁 2.7 什么是上下文的切换 3. 创建线程 3.1 创建线程的四种方式 . 阅读详情

一、进程和线程的基础知识

1、进程和线程的概念

进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存)

线程:进程中的一段代码,一个进程中可以有多段代码。本身不拥有资源(共享所在进程的资源)

在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程。

区别:

1、是否占有资源问题

2、创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大。

3、进程为重量级组件,线程为轻量级组件

多进程: 在操作系统中能同时运行多个任务(程序)

多线程: 在同一应用程序中有多个功能流同时执行

2、线程的主要特点

①、不能以一个文件名的方式独立存在在磁盘中;

②、不能单独执行,只有在进程启动后才可启动;

③、线程可以共享进程相同的内存(代码与数据)。

3、线程的主要用途

①、利用它可以完成重复性的工作(如实现动画、声音等的播放)。

②、从事一次性较费时的初始化工作(如网络连接、声音数据文件的加载)。

③、并发执行的运行效果(一个进程多个线程)以实现更复杂的功能

4、多线程(多个线程同时运行)程序的主要优点

①、可以减轻系统性能方面的瓶颈,因为可以并行操作;

②、提高CPU的处理器的效率,在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性;另一方面,在多CPU系统中,可以把不同的线程在不同的CPU中执行,真正做到同时处理多任务。

  1. 运行任何一个java程序,jvm在运行的时候都会创建一个main线程执行main方法中所有代码
    线程生命周期
    这里写图片描述
    6 一个java应用程序至少有几个线程?
    至少有两个线程, 一个是主线程负责main方法代码的执行,一个是垃圾回收器线程,负责了回收垃圾。

7 多线程的好处:
1. 解决了一个进程能同时执行多个任务的问题。
2. 提高了资源的利用率。

多线程 的弊端:
1. 增加cpu的负担。
2. 降低了一个进程中线程的执行概率。
3. 引发了线程安全 问题。
4. 出现了死锁现象。
二、线程的创建和启动

其实看看API,从Thread的构造方法,就可以看出创建一个线程的方式:

方式一:
1. 自定义一个类继承Thread类。
2. 重写Thread类的run方法 , 把自定义线程的任务代码写在run方法中
疑问: 重写run方法的目的是什么?
每个线程都有自己的任务代码,jvm创建的主线程的任务代码就是main方法中的所有代码, 自定义线程的任务代码就写在run方法中,自定义线程负责了run方法中代码。
3. 创建Thread的子类对象,并且调用start方法开启线程。

注意:一个线程一旦开启,那么线程就会执行run方法中的代码,run方法千万不能直接调用,直接调用run方法就相当调用了一个普通的方法而已并没有开启新的线程。

public class Demo1 extends Thread {

    @Override  //把自定义线程的任务代码写在run方法中。
    public void run() {
        for(int i  = 0 ; i < 100 ; i++){
            System.out.println("自定义线程:"+i);
        }
    }


    public static void main(String[] args) {
        //创建了自定义的线程对象。
        Demo1 d = new Demo1();
        //调用start方法启动线程
        d.start();

        for(int i  = 0 ; i < 100 ; i++){
            System.out.println("main线程:"+i);
        }
    }   
}

方式二

    1.  自定义一个类实现Runnable接口。
    2. 实现Runnable接口 的run方法,把自定义线程的任务定义在run方法上。
    3. 创建Runnable实现类对象。
    4. 创建Thread类 的对象,并且把Runnable实现类的对象作为实参传递。
    5. 调用Thread对象 的start方法开启一个线程。

举一反三两个问题

问题1: Runnable实现类的对象是线程对象吗?
       Runnable实现类的对象并 不是一个线程对象,只不过是实现了Runnable接口 的对象而已。
       只有是Thread或者是Thread的子类才是线程 对象。

问题2: 为什么要把Runnable实现类的对象作为实参传递给Thread对象呢?作用是什么?
    作用就是把Runnable实现类的对象的run方法作为了线程的任务代码去执行了。

推荐使用: 第二种。 实现Runable接口的。 
原因: 因为java单继承 ,多实现的。
public class MythreadRunnable {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    new Thread(new Runnable(){

        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("this" + this);                                //runnable
            System.out.println("当前线程" + Thread.currentThread().getName());  //gouwa
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName()+":"+i);   //gouwa
            }
        }

    },"gouwa").start();
    for(int i = 0 ; i < 100 ; i++){
        System.out.println(Thread.currentThread().getName()+":"+i);   //main
    }
    }

}

线程常用的方法:

Thread(String name) 初始化线程的名字
setName(String name) 设置线程对象名
getName() 返回线程的名字
sleep() 线程睡眠指定的毫秒数。 静态的方法 那个线程执行了sleep方法代码那么就是那个线程睡眠。
currentThread() 返回当前的线程对象,该方法是一个静态的方法, 注意: 那个线程执行了 currentThread()代码就返回那个线程 的对象。
getPriority() 返回当前线程对象的优先级 默认线程的优先级是5
setPriority(int newPriority) 设置线程的优先级 虽然设置了线程的优先级,但是具体的实现取决于底层的操作系统的实现(最大的优先级是10 ,最小的1 , 默认是5)

public class Mythread  extends Thread{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
      Demo3 demo = new Demo3("zhangsan");
      demo.start();
      System.out.println("自定义线程的优先级:"+demo.getPriority());  //线程的优先级默认是5
      System.out.println("主线程的优先级:"+Thread.currentThread().getPriority());
      Thread mainthrad = Thread.currentThread();
      System.out.println("主线程的名字:"+ mainthrad.getName());
}}


class Demo3 extends Thread {

    public Demo3(String name){
        super(name); //调用了Thread类的一个 参数的构造方法。
    }


    @Override
    public void run() {
        System.out.println("this:"+ this);
        System.out.println("当前线程对象:" + Thread.currentThread());

        for (int i = 0; i < 100 ; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);


            try {
                Thread.sleep(1000);  //为什么在这里不能抛出异常,只能捕获?? Thread类的run方法没有抛出异常类型,所以子类不能抛出异常类型。
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


}}

出现线程安全问题的根本原因:
1. 存在两个或者两个以上 的线程对象,而且线程之间共享着一个资源。
2. 有多个语句操作了共享资源。
java线程同步机制的方式:

方式一:同步代码块

        同步代码块的格式:
            synchronized(锁对象){
                需要被同步的代码...
            }

同步代码块要注意事项:
1. 任意的一个对象都可以做为锁对象。
2. 在同步代码块中调用了sleep方法并不是释放锁对象的。
3. 只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率的。
4. 多线程操作的锁 对象必须 是唯一共享 的。否则无效。
5. 当同步代码块被执行完毕时候,锁就会被释放
看个代码

public class Mytickes {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SaleTicket thread1 = new SaleTicket("窗口1");
        SaleTicket thread2 = new SaleTicket("窗口2");
        SaleTicket thread3 = new SaleTicket("窗口3");
        thread1.start();
        thread2.start();
        thread3.start();

    }

}
class SaleTicket extends Thread{
    static int num = 50;
    static Object suo = new Object();
    public SaleTicket(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        while(true){
            synchronized (suo) {
                if(num > 0){
                    System.out.println(Thread.currentThread().getName() + " 售出了第" + num + "号票");
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    num--;
                }else{
                    System.out.println("卖完了");
                    break;
                }
            }
        }
    }

}

方式二:同步函数 同步函数就是使用synchronized修饰一个函数。
同步函数要注意的事项 :
1. 如果是一个非静态的同步函数的锁 对象是this对象,如果是静态的同步函数的锁 对象是当前函数所属的类的字节码文件(class对象)必须要静态否则同步失效,静态也有可能不成功,因为会让同步代码块被整个锁住。
2. 同步函数的锁对象是固定的,不能由你来指定 的。

推荐使用: 同步代码块。
原因:
1. 同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定 的,不能由我们来指定。
2. 同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数 的所有代码都被同步了,只有当整个函数被执行完毕才会释放锁,会有使用局限性。

public class DemoBack {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BankThread thread1 = new BankThread("老公");
        BankThread thread2 = new BankThread("老婆");
        thread1.start();
        thread2.start();

    }

}
class BankThread extends Thread {
    static int count =5000;

    public BankThread(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();

            getMoney();

    }

    private static synchronized void getMoney() {
        while(true){
            if(count>0){
                System.out.println(Thread.currentThread().getName()+"取走了1000块,还剩余"+(count-1000)+"元");
                count-=1000;
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }else{
                System.out.println("取光了");
                break;

            }

    }}

}
此例子的执行结果就是,仅是一个线程取走所有金钱,本质还是锁的范围太大。

三 多线程通讯问题
举例:一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务.
经典的生产者消费者模型
线程有以下几种方法:

wait(): 等待 如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒。
notify(): 唤醒 唤醒线程池等待线程其中的一个。
notifyAll() : 唤醒线程池所有等待 线程。

wait与notify方法要注意的事项:
1. wait方法与notify方法是属于Object对象 的。
2. wait方法与notify方法必须要在同步代码块或者是同步函数中才能 使用。
3. wait方法与notify方法必需要由锁对象调用。
代码片:


public class Demo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Product p = new Product();
        Producer producer = new Producer(p);
        Customer cuntomer = new Customer(p);
        producer.start();
        cuntomer.start();

    }

}
class Product{
    String name;
    double price;
    boolean flag = false;
}
class Producer extends  Thread{
    Product p;

    public Producer(Product p) {
        this.p = p;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        int i =0;
        while(true){
            synchronized (p) {
                if(p.flag == false){
                    if(i%2==0){
                        p.name = "apple";
                        p.price = 6.5;
                    }else{
                        p.name = "banner";
                        p.price = 2.0;
                    }
                    System.out.println("生产者生产出来 " + p.name + "价格是 " + p.price);
                    p.flag = true;
                    i++;
                    p.notifyAll();
                }else{
                    try {
                        System.out.println("生产者在等待");
                        p.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }

    }

}
class Customer extends Thread{
    Product p;

    public Customer(Product p) {
        this.p = p;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        while(true){
            synchronized (p) {
                if(p.flag ==true){
                    System.out.println("消费者消费了"+p.name+" 价格:"+ p.price);
                    p.flag = false;
                    p.notifyAll();
                }else{
                    try {
                        System.out.println("消费者在等待");
                        p.wait();

                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }
        }
    }

}

生产者消费者模型

生产者生产出来 banner价格是 2.0
生产者在等待
消费者消费了banner 价格:2.0
消费者在等待
生产者生产出来 apple价格是 6.5
生产者在等待
消费者消费了apple 价格:6.5
消费者在等待
生产者生产出来 banner价格是 2.0
生产者在等待
消费者消费了banner 价格:2.0
消费者在等待
生产者生产出来 apple价格是 6.5
生产者在等待
消费者消费了apple 价格:6.5

wait() 一个线程如果执行了此方法,该线程会进入一个以锁对象为标示符的线程池中去等待。
notify() 如果一个线程执行了该方法,就会唤醒以锁对象为标示符的线程池中去唤醒其中一个线程。

四 线程的停止

线程的停止:
1. 停止一个线程 我们一般都会通过一个变量去控制的。
2. 如果需要停止一个处于等待状态下的线程,那么我们需要通过变量配合notify方法或者interrupt()来使用。

代码看:

public class Demo6 extends Thread {

    boolean flag = true;

    public Demo6(String name){
        super(name);
    }


    @Override
    public synchronized void run() {
        int i = 0 ;
        while(flag){
            try {
                this.wait(); //狗娃等待..

            } catch (InterruptedException e) {
                System.out.println("接收到了异常了....");
            }
            System.out.println(Thread.currentThread().getName()+":"+i);
            i++;
        }
    }



    public static void main(String[] args) {
        Demo6 d = new Demo6("狗娃");
        d.setPriority(10);
        d.start();

        for(int i = 0 ; i<100 ; i++){
            System.out.println(Thread.currentThread().getName()+":"+i);
            //当主线程的i是80的时候停止狗娃线程。
            //d.interrupt();  // interrupt()根本就是无法停止一个线程。
            if(i==80){
                d.flag = false;
                d.interrupt(); //把线程的等待状态强制清除,被清除状态的线程会接收到一个InterruptedException。 
                /*synchronized (d) {                    
                    d.notify();
                }*/


            }

        }


    }

}
【年后找工作】Java八股必备知识 -- 基础篇 序列化(Serialization)是将对象转换为字节流的过程,使得对象可以在网络上传输或者持久化到硬盘上。反序列化(Deserialization)则是将字节流重新转换为对象的过程,使得对象可以被重新使用。在Java中,通过实现`Serializable`接口来实现序列化和反序列化。`Serializable`接口是一个标记接口,没有任何方法定义,只是起到一个标记的作用。当一个类实现了`Serializable`接口之后,表示该类的对象可以被序列化。 阅读详情

相关推荐

java多线程高并发面试题汇总

多线程和高并发是毕业后求职大厂面试中必问的知识点,自己之前总是面试前才去找相关的知识点面试题来背背,隔段时间又忘了,没有沉淀下来,于是自己总结了下相关的知识点。

mfmfmfo的博客 1073

JAVA高级基础(62)---多线程的介绍

多线程 进程:运行中的一个程序,在计算机中的一个运行路径。一个程序只能有一个进程 线程:是进程的一个组成单元。在一个进程中至少有一个或一个以上的线程存在 Java是最先支持多线程开发的语言之一,Java从一开始就支持了多线程能力,因此Java开发者能常遇到上面描述的问题场景。 进程和线程的区别 是否占有资源问题 一个进程的创建/撤销所需要的开销远远大于一个线程所需要的开销 进...

11onhook的博客 208

最全的Java多线程面试题

1.线程和进程的区别是什么? 根本区别:进程是资源分配最小单位,线程是程序执行的最小单位。计算机在执行程序时,会为程序创建相应的进程,进行资源分配时,是以进程为单位进行相应的分配。每个进程都有相应的线程,在执行程序时,实际上是执行相应的一系列线程。 地址空间:进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段;线程没有独立的地址空间,同一进程的线程共享本进程的地址空间。 资源拥有:进程之间的资源是独立的;同一进程内的线程共享本进程的资源。 执.

yuan5883052的博客 813

java线程几种类型_Java线程类

java线程几种类型 Java线程类 (Java Thread Class) Thread class is the main class on which Java's Multithreading system is based. Thread class, along with its companion interface Runnable will be used to create ...

cunfen6312的博客 2935

Linux内核4.14版本——drm框架分析(1)——drm简介

drm框架分析

yangguoyu8023的博客 1万+

如何用python开发“跳一跳”游戏【附源码】

jump_start_time = pygame.time.get_ticks() # 记录跳跃开始时间。jump_duration = current_time - jump_start_time # 计算跳跃持续时间。current_time = pygame.time.get_ticks() # 获取当前时间。jump_velocity = -15 # 设置跳跃的初始速度。# 如果小球跳跃结束,重置跳跃状态。# 根据跳跃持续时间计算跳跃高度。# 移除超出屏幕的障碍物。

helloshili2011的博客 2495

Java中Process类的使用与注意事项

(1)在项目开发中,经常会遇到调用其它程序功能的业务需求,在java中通常有两种实现方法Runtime runtime = Runtime.getRuntime(); Process p = runtime.exec(cmd);Process p=new ProcessBuilder(cmd).start();(2)在这里就需要认识一下process类:process是一个抽象的类,它包含6个抽象的

Kevin.yang专栏 2万+

Python+Appium实现泛微OA自动打卡:5分钟搭建移动端自动化脚本

移动端自动化测试是软件测试与办公自动化领域的重要技术方向,其核心原理是通过程序模拟用户对手机应用界面的操作,实现重复性任务的自动执行。Appium作为主流的开源移动端自动化框架,基于WebDriver协议,支持跨平台且无需修改被测应用,为自动化脚本开发提供了标准化接口。在工程实践中,结合Python简洁的语法和丰富的生态,可以快速构建稳定可靠的自动化解决方案。这一技术组合的价值在于能够高效处理“重复性、低价值、高频率”的日常操作,例如考勤打卡、数据填报等办公场景,显著提升工作效率。本文以泛微OA Emobi

weixin_28836875的博客 389

Java多线程必备知识(包括进程)

Java多线程必备知识 Java内置多线程支持 进程与线程的区别 进程是系统进行资源分配和调度的一个独立单位 线程是处理机调度的最小单位 进程被包括在进程之中,一个进程中可以并发多个线程 由于进程的切换需要切换页目录使用新的地址空间。而线程只需切换内核栈和硬件上下文,所以线程间切换开销小于进程,提高了程序的运行效率 切换内核栈 :就是从用户态切换到内核态:用户态-内核态-用户态 图1 JVM运行时数据区域 线程生命周期 图2 线程生命周期(菜鸟教程) 阶段 描述 新建

qq_43981344的博客 230

【自由谈】城域网IPv6过渡技术——MAP技术(1)

在IPv4向IPv6网络演进的浪潮中,存在着两对主要矛盾的较量,一对是IPv4地址短缺和IPv4业务蓬勃发展之间的矛盾,另一对是IPv6海量的地址空间和IPv6应用的匮乏之间的矛盾。同时两对矛盾又互相制约,IPv4地址共享机制似乎又减缓了IPv6产业链的发展,IPv6产业链的不断发展似乎又在考验着IPv4地址共享机制的部署规模。MAP成为目前兼顾IPv4和IPv6的4voer6场景中最为关注的技术。

韩立金自由谈 3020

【UE5】RTS游戏的框选功能+行军线效果实现

步骤: 一、项目准备; 二、框选NPC并移动到指定地点; 三、框选效果; 四、行军线效果

ChaoChao66666的博客 2378

java不同进程的相互唤醒_java多线程并发的笔试、面试必备知识大全,不看就要被淘汰了...

关注我,可以获取最新知识、经典面试题以及技术分享 多线程和并发是求职大小厂面试中必问的知识点,其涉及到点很多,难度很大。有些人面对这些问题有点迷茫,为了解决这情况,总结了一下java多线程并发的基础知识点。而且要想深入研究java多线程并发也必须先掌握基础知识,可为后续各个模块深入研究做好做好准备。现在废话不多说,各位看官请查看基础知识点,后续还有源码解析(synchronize底层原理,线程池...

weixin_42545636的博客 101

Coze智能体开发:扣子空间制作PPT功能

扣子空间内置了丰富的场景模板,涵盖人文历史、学术分享、研究报告、数据分析等场景,可以满足不同用户的需求。 你只需输入与制作 PPT 相关的提示词,Agent 就能基于这些提示词展示思考的过程,并自动生成完整的 PPT。

王国平的博客 2052

Java多线程知识点总结(思维导图+源码笔记)

转自:https://blog.youkuaiyun.com/yelvgou9995/article/details/107408709 多线程大家在初学的时候,对这个知识点应该有不少的疑惑的。我认为主要原因有两个: 多线程在初学的时候不太好学,并且一般写项目的时候也很少用得上(至少在初学阶段时写的项目基本不需要自己创建线程)。 多线程的知识点在面试经常考,多线程所涉及的知识点非常多,难度也不低。 这就会给人带来一种感觉「这破玩意涉及的东西是真的广,平时也不怎么用,怎么面试就偏偏爱问这个鬼东西」 不多BB.

折戟 1056

深度学习笔记——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总

本文简要介绍深度学习的前向传播与反向传播,以及前馈神经网络与反馈神经网络。

haopinglianlian的博客 3042

第02章:HSA-Runtime架构概览

摘要: 本章深入解析HSA Runtime的三层架构设计,包括公共API层(C语言接口)、核心实现层(C++业务逻辑)和驱动抽象层(硬件交互)。重点介绍了Runtime的核心组件(Agent、Queue、Signal、Memory)及其关系,以及初始化流程、配置选项和调试功能。通过学习,读者将掌握HSA Runtime的整体架构,为后续模块学习奠定基础。

图形/计算GPU的驱动与虚拟化技术分享园地 2915

java基础知识点题库_Java基础知识点+高频面试题

前言:Java的基础知识点有很多,我把面试中高频面试点列出来和大家一起探讨,如果有什么不对的地方也请您指正,如果觉得不错请您帮忙分享和订阅,您的一份订阅是作者最大的动力,感谢!1:常用的集合有哪些,谈谈你对他们的理解?Collection接口:单列接口,有两个子接口;List接口有三个实现类:LinkedList:基于链表实现,每个元素存储本身内存地址之外还存储下一个元 素的地...

weixin_42509888的博客 232

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JAVA多线程和并发基础面试问答

Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执...

qrn196789910的博客 101

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[转帖]java必备的开发知识和技能

java必备的开发知识和技能 https://blog.youkuaiyun.com/qq_34405062/article/details/89389646 学习一下java 其实上学那会儿学的 早就过时加落伍了.. 而且 还只是 应付考试 1.线程和进程的区别 线程三个基本状态:就绪、执行、阻塞 线程五个基本操...

weixin_30682127的博客 163

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java必备面试题大总结(完整版)

我们使用java编译命令就能将java源文件编译对应成字节码文件(.class),字节码文件是一种八位数据的二进制流文件,可以被JVM快速加载到内存中运行AQS全称abstractQueueSynchronizer,即抽象队列同步器,是一种锁机制,它是作为一个基础框架使用的,像Reentrantlock,countdownlatch都是基于AQS实现的AQS内部维护了一个先进先出的双向队列,队列中存储了排队的线程。

2401_89221867的博客 779

java学习笔记(面试必备)

第一式:java基础 第一招:java的四大特性:抽象,继承,封装,多态 抽象的概念: 这里我先补充一下对象的概念,在java中世界万物皆对象,对象就是客观存在的事物,比如一个人,一支笔。而抽象就是将对象的某些细节和特征抽取出来,用程序代码表示,抽取出来的东西一般我们称之为类或者接口,因此抽象分为两个方面,数据抽象和过程抽象。 数据抽象:就是将事物的共同的特征用程序代码表示,通过抽象成为对...

Riztal的博客 1万+

并发编程核心知识点第一弹

并发编程高频面试题,题目后面星星数量越多,表示面试中出现的概率越高 目录 最近小伙伴,让我帮忙找一些面试题、架构、设计类资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,你也需要的话欢迎下载!点赞收藏+评论转发+关注我之后私信我,注意回复【000】即可白嫖 什么是进程?是什么线程? * * * 线程是处理器任务调度和执行的基本单位,进程是操作系统资源分配的基本单位。 进程是程序的一次执行过程,是系统运行的基本单位。线程是一个...

m0_67698950的博客 135

Android最全2024Android多线程面试总结(1),2024年最新面试资料分享

内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成。x++也不是原子性操作,它包含三部,第一,读取x,第二,对x加1,第三,写入内存。

2401_84545339的博客 915

72道 并发编程 面试题!

你好,我是老田今天分享的是Java并发编程必备的72连环炮,希望通过这种连环炮的方式,让大家更好吸收知识点,同时也是面试中出现频率非常高。上帝视角 废话不多说,直奔主题。开始发炮 1、 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,...

田维常 334

Java 面试知识点

零、自我介绍 一、笔试、算法 二、Java基础 三、项目经验

NowMore_Guo的博客 248
上一篇: Java(六) final用法实例讲解
下一篇: Java(八) Collection集合必备知识
class2class
博客等级 码龄15年 16粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值