1.多线程的实现有几种方式?实现步骤分别是怎样的?
四种。目前学了两种,分别为:
继承Thread类,重写run方法,创建子类对象,实例调用start(),开启新线程;
实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target,Threa的实例实例对象调用Start(),开启新线程。
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
区别:继承Thread类是多个线程分别完成自己的任务,实现Runnable是多个线程共同完成一个任务。
实现Runnable接口的优势: 1. 适合多个相同的程序代码的线程去共享同一个资源。 2. 可以避免java中的单继承的局限性。 3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和数据独立。 4. 线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类。
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
多个线程共享同一资源,同时对其进行改写、设置等操作。造成了异常数据,例如课程中的例子卖票造成的,一张票重复卖出,或者卖了第0、-1张票。
4.sleep()方法和wait()方法的区别?
sleep():相当于运行了一个方法,而方法体的运行时间为设置的参数,不会释放锁,时限到后,继续执行下列代码;
wait():是位于同步代码块里面的,调用该方法,就释放锁,处于计时等待或者无限等待,时限到了或者被其他线程notify()唤醒,这是就加入到对锁的争抢当中,只有当抢到锁,才会进行运行状态,否则则为锁阻塞状态。
5.线程有几种状态?他们之间是如何转化的?
6种。
1.NEW(新建) 线程刚被创建,但是并未启动。 2.Runnable(可运行) 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。 3.Blocked(锁阻塞) 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。 4.Waiting(无限等待) 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。 5.Timed Waiting(计时等待) 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait。 6.Teminated(被终止) 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。
|