46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
第一种:new Thread( ){ }.start( );调用Thread子类对象的run方法
第二种:new Thread(new Runnable(){ }).start();调用Thread对象接受Runnable对象的run方法
分别是继承Thread类与实现Runnable接口
用synchronized关键字修饰同步方法
47、sleep() 和 wait()有什么区别?
sleep是线程类(Thread)的方法
wait是Object类的方法
48、同步和异步有何异同,在什么情况下分别使用他们?举例说明
同步就是指一个线程要等上一个线程执行完之后才开始执行当前的线程(资源共享)
异步就是指一个线程去执行,下一个线程不必等待它执行完就开始执行(只有一个线程访问当前的数据)
50、多线程有几种实现方法?同步有几种实现方法?
多线程有2种,继承Thread类与实现Runnable接口
同步有2种,synchronized,wait与notify
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
51、启动一个线程是用run()还是start()?
start() run()是该线程所关联的执行代码
52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
1)其他方法前没有synchronized关键字,则能
2)该方法内部调用wait,则能
3)都加了synchronized,并且内部没有调用wait,则不能
4)若方法是static,用的同步锁是当前类的字节码,则不能
53、线程的基本概念、线程的基本状态以及状态之间的关系 ?
线程:一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索
状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronize内部调用。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,
由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
54、简述synchronized和java.util.concurrent.locks.Lock的异同 ?
相同:Lock能完成synchronized所实现的所有功能
不同:Lock有比synchronized更精确的线程语言和更好的性能。synchronized会自动释放锁,Lock一定要手动释放,并且必须在finally从句中释放。Lock的tryLock
可以非阻塞方式去拿锁