关于多线程的几道面试小题
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 }
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 }
我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何通过java程序来实现多线程的程序呢?
如何通过java程序来实现多线程的程序呢? * * 如何通过java程序来实现多线程的程序呢? * 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。 * 而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。 * * 而Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。 * 但是呢?Java可以去调用C/C++写好的程序来间接实现多线程程序。 * * 由C/C++程序去调用系统功能去创建进程,然后由Java进行封装后,这样会产生一些类,我们通过这些类创建的对象去调用他们即可! * * 这样我们就可以通过java程序来实现多线程程序了。 * * 那么Java提供的类是什么呢? * Thread类 * 通过查看API,我们知道了有2种方式可以实现多线程程序。 * (其实有三种方法,第三种明天讲) 我的GitHub地址: https://github.com/heizemingjun 我的博客园地址: http://www.cnblogs.com/chenmingjun 我的蚂蚁笔记博客地址: http://blog.leanote.com/chen...
- 下一篇
字典的魔法
dict 创建一个字典 info = { "k1": "v1", "k2":"v2" } 字典value info = { "k1":18, "k2":True, "k3":[ 11, 22, 33, { 'kk1':'vv1', 'kk2':'vv2', 'kk3':'vv3' } ] } print(info) --- {'k3': [11, 22, 33, {'kk3': 'vv3', 'kk1': 'vv1', 'kk2': 'vv2'}], 'k2': True, 'k1': 18} 布尔值为key时,如果有数字1或0为key时,可能会重复,key需要是唯一的。 info = { 1:'asdf', "hehe":"asdf", True:"123" } print(info) --- {1: '123', 'hehe': 'asdf'} 要点 数字允许为key 列表不能做为字典的key 字典也不能做为字典的key 字典是无序的。 字典可以循环,默认循环所有的key 字典取值 v = info["k1"] print(v) --- 18 通过索引的方式找到指定的值。 v = ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题