关于多线程的几道面试小题

简介: 1.自定义类MyThread继承Thread类,为什么要重写run()方法?   自定义类中不是所有的代码都需要被线程执行。  而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()方法,用来包含那些需要被线程执行的代码。

1.自定义类MyThread继承Thread类,为什么要重写run()方法?

  自定义类中不是所有的代码都需要被线程执行。
  而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()方法,用来包含那些需要被线程执行的代码。
  
  注意:这里的 被线程执行 = 开一个新线程执行

2.run()和start()的区别?
  run():仅仅是封装被线程执行的代码,直接调用就是普通方法。
  start():首先启动了线程,然后再由jvm去调用该线程的run()方法。

3.线程能不能多次启动start()

  不能,一个线程不能被多次启动。线程被多次启动会抛出异常:IllegalThreadStateException:非法的线程状态异常

示例代码如下:

 1 package cn.itcast_02;
 2 
 3 /*
 4  * 该自定义的类为什么要重写run()方法?
 5  *         自定义类中不是所有的代码都需要被线程执行。
 6  *         而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()方法,用来包含那些需要被线程执行的代码。
 7  * 
 8  *         注意:这里的  被线程执行 = 开一个新线程执行
 9  */
10 public class MyThread extends Thread {
11     // 不需要被线程执行的代码
12     public void show() {
13         System.out.println("不需要被线程执行的代码"); // 这么简单的程序去开一个新的线程,纯属浪费啊!
14     }
15     
16     // 需要被线程执行的代码
17     @Override
18     public void run() {
19         // System.out.println("好好学习,天天向上"); // 这么简单的程序去开一个新的线程,纯属浪费啊!
20         
21         // 一般来说,被线程执行的代码肯定是比较耗时的。
22         // 所以这里示例:我们使用循环
23         for (int x = 0; x < 1000; x++) {
24             System.out.println(x);
25         }
26     }
27 
28 }
MyThread.java
 1 package cn.itcast_02;
 2 
 3 /*
 4  * 需求:我们要实现多线程的程序。
 5  * 
 6  * 如何通过java程序来实现多线程的程序呢?
 7  *         由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
 8  *         而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。
 9  * 
10  *         而Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。
11  *         但是呢?Java可以去调用C/C++写好的程序来间接实现多线程程序。
12  * 
13  *         由C/C++程序去调用系统功能去创建进程,然后由Java进行封装后,这样会产生一些类,我们通过这些类创建的对象去调用他们即可!
14  * 
15  *         这样我们就可以通过java程序来实现多线程程序了。
16  * 
17  * 那么Java提供的类是什么呢?
18  *         Thread类
19  *         通过查看API,我们知道了有2种方式可以实现多线程程序。
20  *         (其实有三种方法,第三种明天讲)
21  * 
22  * 方式1:继承Thread类。
23  *         是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。之后就可以分配并启动该子类的实例了。
24  * 步骤
25  *         A:自定义类MyThread继承Thread类
26  *         B:MyThread类里面重写run()方法
27  *         C:在测测试类中创建自定义类的对象(创建对象)
28  *         D:启动线程
29  */
30 public class MyThreadDemo {
31     public static void main(String[] args) {
32         // 创建线程对象
33         // MyThread my = new MyThread();
34         // 启动线程
35         // my.run();
36         // my.run();
37         
38         // 调用run()方法为什么是单线程的呢?
39         // 因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果。
40         
41         // 要想看到多线程的效果,就必须说说另一个方法:start()
42         // 面试题:run()和start()的区别?
43         // run():仅仅是封装被线程执行的代码,直接调用就是普通方法。
44         // start():首先启动了线程,然后再由jvm去调用该线程的run()方法。
45         
46         // MyThread my = new MyThread();
47         // my.start();
48         // my.start();
49         // IllegalThreadStateException:非法的线程状态异常
50         // 为什么呢?因为这个相当于是my线程被调用了两次。而不是两个线程被启动。一个线程不能被多次启动。
51 
52         // 创建两个线程对象
53         MyThread my1 = new MyThread();
54         MyThread my2 = new MyThread();
55 
56         my1.start();
57         my2.start();
58     }
59 }
MyThreadDemo.java

  

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
目录
打赏
0
0
0
0
24
分享
相关文章
阿里面试:5000qps访问一个500ms的接口,如何设计线程池的核心线程数、最大线程数? 需要多少台机器?
本文由40岁老架构师尼恩撰写,针对一线互联网企业的高频面试题“如何确定系统的最佳线程数”进行系统化梳理。文章详细介绍了线程池设计的三个核心步骤:理论预估、压测验证和监控调整,并结合实际案例(5000qps、500ms响应时间、4核8G机器)给出具体参数设置建议。此外,还提供了《尼恩Java面试宝典PDF》等资源,帮助读者提升技术能力,顺利通过大厂面试。关注【技术自由圈】公众号,回复“领电子书”获取更多学习资料。
面试大神教你:如何巧妙回答线程优先级这个经典考题?
大家好,我是小米。本文通过故事讲解Java面试中常见的线程优先级问题。小明和小华的故事帮助理解线程优先级:高优先级线程更可能被调度执行,但并非越高越好。实际开发需权衡业务需求,合理设置优先级。掌握线程优先级不仅能写出高效代码,还能在面试中脱颖而出。最后,小张因深入分析成功拿下Offer。希望这篇文章能助你在面试中游刃有余!
40 4
面试大神教你:如何巧妙回答线程优先级这个经典考题?
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
78 14
面试中的难题:线程异步执行后如何共享数据?
本文通过一个面试故事,详细讲解了Java中线程内部开启异步操作后如何安全地共享数据。介绍了异步操作的基本概念及常见实现方式(如CompletableFuture、ExecutorService),并重点探讨了volatile关键字、CountDownLatch和CompletableFuture等工具在线程间数据共享中的应用,帮助读者理解线程安全和内存可见性问题。通过这些方法,可以有效解决多线程环境下的数据共享挑战,提升编程效率和代码健壮性。
57 6
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
88 16
面试直击:并发编程三要素+线程安全全攻略!
并发编程三要素为原子性、可见性和有序性,确保多线程操作的一致性和安全性。Java 中通过 `synchronized`、`Lock`、`volatile`、原子类和线程安全集合等机制保障线程安全。掌握这些概念和工具,能有效解决并发问题,编写高效稳定的多线程程序。
81 11
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
45 6
Java 多线程 面试题
Java 多线程 相关基础面试题
面试必问的多线程优化技巧与实战
多线程编程是现代软件开发中不可或缺的一部分,特别是在处理高并发场景和优化程序性能时。作为Java开发者,掌握多线程优化技巧不仅能够提升程序的执行效率,还能在面试中脱颖而出。本文将从多线程基础、线程与进程的区别、多线程的优势出发,深入探讨如何避免死锁与竞态条件、线程间的通信机制、线程池的使用优势、线程优化算法与数据结构的选择,以及硬件加速技术。通过多个Java示例,我们将揭示这些技术的底层原理与实现方法。
138 3
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等