1.多线程的实现有几种方式?实现步骤分别是怎样的?
继承Thread类方式
创建一个子类直接继承Thread,
重写run方法
在测试类中创建子类对象,调用start()方法
实现Runnable接口方式
1. 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
2. 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
3. 调用线程对象的start()方法来启动线程。
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
实现Runnable接口创建多线程程序的好处:
1.避免了单继承的局限性
一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类
实现了Runnable接口,还可以继承其他的类,实现其他的接口
2.增强了程序的扩展性,降低了程序的耦合性(解耦)
实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
实现类中,重写了run方法:用来设置线程任务
创建Thread类对象,调用start方法:用来开启新线程
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
当多线程访问共享数据并执行写操作时,就会发生线程安全问题;
解决线程问题有三种方式:
方案一:同步代码块(锁对象为任意对象 obj)
方案二:同步方法(锁对象是实现类本身,也就是this)
方案三:静态方法(锁对象是本类的class对象--RunnableImpl.class)
4.sleep()方法和wait()方法的区别?
sleep()参数列表输入long值 ,代表毫秒值,在休眠指定毫秒后将自动恢复运行。而wait()无参方法将进入无限睡眠,如果没有notify方法唤醒就不会恢复运行wait()数列表输入long值,代表毫秒值,在休眠指定毫秒后将自动恢复运行。不过可以提前被notify 唤
|