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

简介: 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 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
1月前
|
并行计算 安全 Java
C# .NET面试系列四:多线程
<h2>多线程 #### 1. 根据线程安全的相关知识,分析以下代码,当调用 test 方法时 i > 10 时是否会引起死锁? 并简要说明理由。 ```c# public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } ``` 在给定的代码中,不会发生死锁。死锁通常是由于两个或多个线程互相等待对方释放锁而无法继续执行的情况。在这个代码中,只有一个线程持有锁,且没有其他线程参与,因此不
105 3
|
3月前
|
Java 调度 Windows
JAVA面试八股文之多线程基础知识
JAVA面试八股文之多线程基础知识
|
4月前
|
Java 关系型数据库 数据库连接
BATJ高频面试249道题:微服务+多线程+分布式+MyBatis +Spring
本文收集整理了各大厂常见面试题N道,你想要的这里都有内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈,希望大家都能找到适合自己的公司,开开心心的撸代码。
|
7天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
27 0
|
1月前
|
消息中间件 存储 算法
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
43 1
|
7月前
|
安全
多线程访问同步方法的7种情况(面试常考)
多线程访问同步方法的7种情况(面试常考)
35 0
多线程访问同步方法的7种情况(面试常考)
|
3月前
|
消息中间件 数据库
面试题解析:RabbitMQ在多线程秒杀系统中的关键作用
面试题解析:RabbitMQ在多线程秒杀系统中的关键作用
34 0
|
3月前
|
存储 算法 安全
程序员的100大Java多线程面试问题及答案(二)
程序员的100大Java多线程面试问题及答案(二)
|
3月前
|
存储 安全 Java
程序员的100大Java多线程面试问题及答案(一)
程序员的100大Java多线程面试问题及答案(一)
|
3月前
|
安全 Linux Go
golang面试:golang并发与多线程(三)
golang面试:golang并发与多线程(三)
45 0