A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 厦门校区   /  2019-6-28 17:02  /  3837 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.多线程的实现有几种方式?实现步骤分别是怎样的?

(1)继承Thread类
a.定义一个类继承Thread类
b.在类中重写run()方法
c.创建类的对象
d.调用start()方法,启动线程
(2)实现Runnable接口
a.定义一个类实现Runnable接口
b.在实现类中重写run()方法
c.创建实现类的对象
d.创建Thread类的对象,把实现对象作为构造方法的参数
e.调用start()方法,启动线程
JAVA语言是单继承,多实现,单独的一个类没有进行共性的抽取,只是重写方法,又不能做到资源共享,建议用实现。

2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?

区别;
(1)Runnable是一个是接口,Thread是该接口的一个子类。
(2)Thread不能做到资源共享,线程与线程之间相互独立,也就不会出现安全问题。实现Runnable接口可能会出现安全问题。
(3)继承Thread类可以不重写方法run方法,也可运行(没有意义),实现Runnable接口必须重写run方法。
优势:
(1)避免了Java单继承的局限性。
(2)适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想。
(3)把设置线程任务和开启新线程进行了分离,增加了扩展性,降低了耦合性。

3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?

线程安全的前提条件是:a.多线程环境 b.有共享数据c.有多条语句操作共享数据。多个线程同时进入到一个代码块,又一同去执行下面的非源子项的代码,造成线程安全问题。
由线程安全的条件,要想解决线程安全,只能对第三条进行操作,解决思路是只能有一个线程进入代码块,直到此线程从代码块出去,其他线程才能进入。
可以得到三种方法:
(1)同步代码块,synchronized(任意对象) { 多条语句操作共享数据的代码 } 就相当于给代码加锁了,任意对象就可以看成是一把锁,但是当线程很多时,效率会低。
(2.1)同步方法,就是把synchronized关键字加到方法上,格式是修饰符 synchronized 返回值类型 方法名(方法参数) { 方法体;}同步方法的锁对象是this。
(2.2)同步静态方法就是把synchronized关键字加到静态方法上,修饰符 static synchronized 返回值类型 方法名(方法参数) { 方法体; }同步静态方法的锁对象是什类名.class。
(3)Lock锁,lock()加同步锁,unlock() :释放同步锁。

4.sleep()方法和wait()方法的区别?

(1)wait()是放弃CPU的执行,无限等待,放弃锁对象,必须调用notify或者notifyAll方法才能唤醒。sleep()是此线程暂停执行指定时间,给其他线程执行机会,
但是依然保持着监控状态,过了指定时间会自动恢复,调用sleep()方法不会释放锁对象。
(2)sleep()必须要传入参数,wait()可以不传入参数,也可传入参数。
(3)作用范围,sleep()是一个静态的方法,可以在任何的地方使用,wait()只能在同步代码块或者同步方法中使用。
回复 使用道具 举报

1.多线程的实现有几种方式?实现步骤分别是怎样的?
答:两种方式,分别是通过继承Thread类、实现Runnable接口。
继承Thread类实现步骤:
(1)一个类名为MyThread继承Thread类
(2)重写run方法
(3)在测试类创建线程MyThread对象
(4)MyThread对象调用start()方法启动线程
实现Runnable接口步骤:
(1)一个类实现Runnable接口
(2)重写run方法
(3)在测试类中创建线程任务对象
(4)创建线程对象,传递线程任务和线程名称
(5)调用start()方法启动线程
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
答:继承Thread类和实现Runnable接口都能够实现多线程,但由于继承的单一性,若使用了继承Thread类的方法后续便不能在继承其他类了,而以实现Runnable接口的方法可以继承其他类。
实现Runnable接口的好处:
(1)避免了Java单继承的局限性
(2)适合多个相同的程序代码去处理同一个任务资源的情况,把线程和程序的代码、数据有效的分离,较好的体现了面向对象的设计思想。
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
答:线程安全问题的产生原因:多线程操作同一个资源,并对其执行操作的时候。
解决方式有三种:
(1)同步代码块
(2)同步方法
(3)lock锁
4.sleep()方法和wait()方法的区别?
答:sleep和wait都是线程的阻塞方法,但sleep是Thread类的方法,wait是Object类的方法。
   调用sleep()方法对象会暂时失去CPU的执行权,锁对象不会被放弃,当休眠时间到会自动获得CPU的执行权
   使用wait()方法对象的会失去CPU的执行权,锁对象被放弃,需要调用notify()方法才会唤醒对象。
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马