本帖最后由 AllenIverson 于 2015-7-25 19:19 编辑
多线程 | | 1. 继承Thread类,重写run()方法。 2. 实现Runnable接口,new Thread(new Runnable(){…}){…}; 3. 实现Callable接口。和线程池结合。 | | 1. 将线程的任务从线程的子类中分离出来,进行了单独的封装,实现数据和程序分离,按照面向对象的思想将任务封装成对象。 2. 避免了Java单继承的局限性。所以,创建线程的第二种方式较为常用。 | | 1. 多个线程在处理同一资源,但是任务却不同,这时候就需要线程间通信。 2. 等待/唤醒机制涉及的方法 1) wait():让线程处于冻结状态,被wait的线程会被存储到线程池中。 2) notify():唤醒线程池中的一个线程(任何一个都有可能)。 3) notifyAll():唤醒线程池中的所有线程。 | | 1. wait可以指定时间也可以不指定。sleep必须指定时间。 2. 在同步中时,对CPU的执行权和锁的处理不同。 wait:释放执行权,释放锁。Object中的方法。 sleep:释放执行权,不释放锁。Thread中的方法。 | | 1. String getName(),void setName(String name) 2. static Thread currentThread() 3. int getPriority():获取线程优先级 4. void setPriority(int newPriority):设置线程优先级 5. static void sleep(long millis):线程休眠 6. void join():线程加入,static void yield():线程礼让 7. setDaemon(boolean on):后台线程/守护线程 8. void stop( ),interrupt( ):中断线程 | | 新建,就绪,运行,阻塞(同步阻塞,等待阻塞,其他阻塞),死亡 |
多线程面试题 一、多线程有几种实现方案,分别是哪几种? (1) 三种。 (2) 继承Thread类,重写run()方法 (3) 实现Runnable接口,new Thread(new Runnable(){…}){…}; (4) 实现Callable接口。和线程池结合。
二、创建线程方式二:实现Runnable接口 (1)定义类实现Runnable接口。 (2)覆盖接口中的run方法,将线程的任务代码封装到run方法中。 (3)通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。 为什么?因为线程的任务都封装在Runnable接口子类对象的run方法中。所以要在线程对象创建时就必须明确要运行的任务。 (4)调用线程对象的start方法开启线程。 三、实现Runnable接口的好处: 1.将线程的任务从线程的子类中分离出来,进行了单独的封装,按照面向对象的思想将任务封装成对象。 2.避免了Java单继承的局限性。所以,创建线程的第二种方式较为常用。
四、同步有几种方式,分别是什么? 同步代码块: synchronized(对象) { 需要被同步的代码;} 同步方法: 把同步关键字synchronized加到方法上,锁对象是this
五、启动一个线程是run()还是start()?它们的区别? start(); run():封装了被线程执行的代码,直接调用仅仅是普通方法的调用 start():启动线程,并由JVM自动调用run()方法
六、sleep()和wait()方法的区别 sleep():必须指时间;不释放锁。 wait():可以不指定时间,也可以指定时间;释放锁。
七、为什么wait(),notify(),notifyAll()等方法都定义在Object类中 因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁。 而Object代码任意的对象,所以,定义在这里面。
八、线程的生命周期图 新建 -- 就绪 -- 运行 -- 死亡 新建 -- 就绪 -- 运行 -- 阻塞 -- 就绪 -- 运行 -- 死亡 建议:画图解释。
|