首页 > 编程语言 >【Java基础】--线程(包含面试题)

【Java基础】--线程(包含面试题)

时间:2024-07-03 20:00:14浏览次数:3  
标签:面试题 Java Thread -- Callable 线程 new 多线程 public

本章主要了解什么是进程?进程和线程有什么关系?有什么区别?以及创建线程的方式有哪些?

1.什么是进程?

简单的来说,进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存。

2.什么是线程?

线程,又称轻量级进程(Light Weight Process)。
线程是进程中的一条执行路径,也是CPU的基本调度单位。
若一个程序可同一时间执行多个线程,就是支持多线程的.
一个进程由一个或多个线程组成,彼此间完成不同的工作(任务),
同时执行,称为多线程。

3.为什么使用多线程?

        我们其实可以将这个问题换个角度思考,使用单线程处理问题时有什么不足?单线程处理方式在面对耗时任务时会导致程序阻塞,效率降低,并且CPU在等待I/O操作时资源利用率不高。相比之下,多线程通过并发执行多个任务,利用时间片轮转机制,提高了CPU资源的利用率,优化了I/O操作的等待时间,从而在宏观上实现了任务的并行处理。这种机制显著改善了用户体验,减少了等待时间,使得程序能够快速响应用户操作,同时进行多个任务,提高了整体的灵活性和效率。

4. java如何创建多线程

java中提供了三种实现多线程的方式:

第一种: 继承Thread类

第二种: 实现Runnable接口

第三种: 实现Callable接

4.1继承Thread类

第一种是使用继承Thread类来实现的

代码示例:接下来我们写一个小案例以便更好的理解,使用使用线程Thread类实现4个窗口各卖100张票

public class SellTicket extends Thread {
    @Override
    public void run() {
        int tick = 100;
        while (true) {
            if (tick > 0) {
                //getName获取线程名:默认的名称Thread-n. 该方法必须在Thread类下才能用
                //Thread.currentThread():获取当前正在执行的线程对象
                System.out.println(Thread.currentThread().getName() + "出售第" + tick + "张票");
                tick--;
            } else {
                System.out.println("票卖完了");
                break;
            }
        }
    }

}



// 测试

public class SellTicketTest {
    public static void main(String[] args) {
        SellTicket sellTicket = new SellTicket();
        //setName设置线程名
        sellTicket.setName("线程A");
        sellTicket.start();
        SellTicket sellTicket1 = new SellTicket();
        sellTicket1.setName("线程B");
        sellTicket1.start();
    }
}

4.2实现Runnable接口

第二种是实现Runnable接口来实现的

代码示例:接下来我们写一个小案例以便更好的理解,使用使用线程Thread类实现4个窗口共卖100张票

public class SellTicket implements Runnable {
    private int tick = 100;

    @Override
    public void run() {
        while (true) {
            if (tick > 0) {
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                tick--;
                System.out.println(Thread.currentThread().getName() + "卖了一张票;剩余:" + tick + "张");
            } else {
                break;
            }
        }
    }
}



// 测试

public class TestTick {
    public static void main(String[] args) {
        SellTicket task=new SellTicket();

        Thread t1=new Thread(task,"窗口A");
        Thread t2=new Thread(task,"窗口B");
        Thread t3=new Thread(task,"窗口C");
        Thread t4=new Thread(task,"窗口D");

        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

分析出: 超卖和重卖现象。 这是因为多个线程共享一个资源,导致了线程安全隐患问题。后期我们可以使用锁解决。

上两种方式继承Thread和实现Runnable那种方式比较好:

使用第二种,因为第二种的扩展性更好。

4.3实现Callable接口

Callable是一个接口(interface),它允许开发者定义一个可调用的任务,这个任务可以在多线程环境下执行,并且可以返回一个结果或者抛出一个异常。Callable接口的设计使得程序员可以使用多线程的方式来执行计算,并且能够获取到计算的结果或者处理任务执行过程中的异常情况。

代码示例: 创建线程计算1~1000之间求3倍数的和

public class MyCallable implements Callable<Integer> {
    private int sum = 0;
    @Override
    public Integer call() throws Exception {
        for (int i = 0; i < 1000; i++) {
            if (i % 3 == 0){
                sum += i;
            }
        }
        return sum;
    }
}


// 测试

public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable myCallable = new MyCallable();
       FutureTask futureTask = new FutureTask(myCallable);
       Thread t = new Thread(futureTask);
        t.start();
        Integer i = (Integer) futureTask.get();
        System.out.println(i);
    }
}

面试题总结:

1. 什么线程和进程?
2. 创建线程的方式?
3. Thread类中常用的方法。
4. Runable和Callable的区别?
    1.Callable有返回值,而且抛出异常。而Runnable无返回值和异常抛出
    2.Callable她是对Runnable的补充。

标签:面试题,Java,Thread,--,Callable,线程,new,多线程,public
From: https://blog.csdn.net/As_Yua/article/details/140159892

相关文章

  • 这个神器绝了!可视化 Python 打包 exe
     在Python开发中,如何将脚本打包成独立的可执行文件,是许多开发者面临的挑战。特别是在需要将应用程序分发给不具备Python环境的用户时,打包工具显得尤为重要。auto-py-to-exe作为一款强大的Python打包工具,为开发者提供了简便快捷的解决方案。那么,auto-py-to-exe究竟是如何简化......
  • 【Java基础】——反射
    1.什么是反射反射是指在程序运行时能够访问、检查和修改自身状态或行为的能力。通过反射,程序可以动态地获取类的信息、调用类的方法,并修改类的属性。再简单点来说,反射就是类在运行期间,把类中成员抽取为其他类的过程就是反射。2.为什么使用反射(面试常问)关于这个问题,如果按照......
  • 基于无线传感器网络的LC-DANSE波束形成算法matlab仿真
    1.程序功能描述       在无线传感器网络中,通过MATLAB对比LC-DANSE波束形成算法和LCMV波束形成算法。对比SNR,mse等指标。                2.测试软件版本以及运行结果展示MATLAB2022a版本运行  3.核心程序forIter=IterationIte......
  • 交叉测试的优点和缺点
    在软件测试领域,确保产品的高质量和稳定性是每个开发团队的目标。交叉测试作为一种重要的测试方法,能够有效发现隐藏的缺陷。然而,交叉测试是否总是最佳选择?让我们一起探讨它的优点和缺点。交叉测试在软件测试中具有重要的地位和作用。通过交叉测试,可以提高软件质量、提升用户体......
  • 车载测试之-CANoe创建仿真工程
    在现代汽车工业中,车载测试是确保车辆电子系统可靠性和功能性的关键环节。而使用CANoe创建仿真工程,不仅能够模拟真实的车辆环境,还能大大提升测试效率和准确性。那么,CANoe是如何实现这些的呢?车载测试中,为什么选择使用CANoe创建仿真工程?它具备哪些独特的功能和优势,能够在复杂的车......
  • 更^{2+eps}炫酷的反演魔术
    参考资料:x义x:更炫酷的反演魔术,x义x:更更炫酷的反演魔术考虑将二项式反演的符号化方法扩展到斯特林反演上。染色问题现有一排\(n\)个格子,每个格子皆可涂成\(c\)种颜色之一。给定集合\(W\),定义一个染色合法当且仅当:对于任意格子,记和它颜色相同的格子有\(x\)个(包括......
  • Java 网络编程
    IP地址IP地址的组成IP地址=网络地址+主机地址网络地址:标识计算机或网络设备所在的网段主机地址:标识特定主机或网络设备一般是C类4组8位2进制组成cmd查看自己的IP:ipconfigcmd查看网络是否可以链接:pingIP地址五层协议1、物理层:基于电气特性的高低电压(电信号)高......
  • 高项-组织通用管理
    1、人力资源管理内容:规划、招聘、维护、提升、评价。2、工作分析的作用:招聘和选择员工、发展和评价员工、薪酬政策、组织与岗位设计。工作分析四个阶段(范围、确定方法、收集、评价):第一阶段:明确工作分析范围(1)确定工作分析的目的(2)确定工作分析的对象第二阶段:确......
  • 装了一次没成功的前提下,ubuntu18.04+ros(melodic)安装 cartographer源码安装及测试---
    因为项目需要所以要安装cartographer,最开始也没仔细研究一下,随便找了一个csdn教程就跟着安装了,装了一下午,总是在最后编译的时候出错,晚上的时候心态崩了,咸鱼上找了个远程安装的,他好像是用小鱼的那个脚本安装,装了一个小时也没安装好。不死心的我又去咸鱼上找人,然后开口要两千块,两......
  • 一些关于flume的知识知识碎片
    Flume架构Flume概述flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力。flume的数据流由事件(Event)贯穿始终......