1.多线程的实现有几种方式?实现步骤分别是怎样的?
第一种方式:
创建Thread类的子类对象 其子类需要重写 run()方法;
子类对象调用start()方法开启线程
第二种方式:
定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
2. 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,Thread对象才是真正的线程对象。
3. 调用线程对象的start()方法来启动线程。
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
实现Runnable接口:是创建线程任务对象 然后将任务对象通过构造方法传入thread对象中 2. 可以避免java中的单继承的局限性。 3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和数据独立。 4. 线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
安全问题:共享一个线程的时候,涉及到多个线程操作(修改、写的的操作)一个全局或者静态的资源数据的时候会发生数据不符合预期,数据错误。
4.sleep()方法和wait()方法的区别?
sleep 是进入 计时等待
wait 是进入无线等待
5.线程有几种状态?他们之间是如何转化的?
6种状态: 1. new 创建 2.runnable 可运行 3. time_wait 计时等待 4.wait 无线等待 5. Blocked(锁阻塞) 6.Teminated 终止
(1)新建一个线程对象处于可运行状态,如果它抢到了锁对象,就可以运行,如果没抢到就会进入阻塞状态,
(2)当线程抢到锁,通过sleep方法进入TimedWaiting状态,sleep时间结束后进入可运行状态,如果是Wait方法结束那么就需要重新去抢锁,如果抢到就进入可运行状态
没抢到就进入阻塞状态。
(3)当线程抢到锁,通过wait()方法进入无线等待状态,如果被其他线程就需要等待其他线程的唤醒,当其他线程唤醒它时,就需要去抢夺锁,抢到就运行,没抢到进入阻塞
状态。
(4)线程任务运行完线程就被终止。
|