1.多线程的实现有几种方式?实现步骤分别是怎样的?
继承Thread类: 继承Thread类,并重写Run()方法,在Run()方法中写出线程要操作的功能,然后使用子类对象名.start()来启用线程,不能使用对象名.Run()方法来调用,使用对象名.Run()方法并不是启用线程!只是普通的对象调用方法而已.
实现Runnable接口:创建Runnable接口的实现类,并且重写Run()方法,然后创建实现类对象,因为Runnable接口中并没有Start()方法,所以要创建Thread对象,把Runnable的实现类对象传入,然后通过.Start()方法来调用.
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
如果是继承Thread类不适合资源共享,实现Runnable接口容易实现资源共享
实现Runnable接口的优势
在JAVA中,只支持单继承,如果我们继承了Thread类,那么我们就不能再继承其的类.这样是有局限性的.
可以解除程序的耦合性,如果使用继承,那么每次创建对象时,都会使用到该对象的资源,这样就使得程序的耦合性过高,如果是使用实现接口的方法来创建线程,那么可以大大降低程序的耦合性.
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
当多个线程访问同一个数据时,并且有进行修改数据等操作时,会出现线程安全问题.比如售票,多个窗口同时售票,如果不同步的话,会出现重复的票或者是不存在的票.
1.同步代码块
synchronized(对象锁){
把需要同步的代码.
}
当多个线程访问时,只有第一个线程能拿到对象锁,并且带走对象锁,直到该块代码执行完成,才会吧锁归还,其他线程在执行到此代码时,如果没有对象锁,则会进入阻塞状态,直到拿到对象锁的线程执行完代码并且释放对象锁时,才能拿到对象锁并且进入代码中执行代码.使用同步代码块的前提是多个线程必须使用同一把锁.
2.同步方法 同步方法分为静态方法,和非静态方法.
非静态同步方法的创建格式为,
修饰符 synchronized 返回值类型 方法名称(参数列表){
这里面放需要同步的代码
}
静态同步方法的创建格式为,
修饰符 static synchronized 返回值类型 方法名称(参数列表){
这里面放需要同步的代码
}
关于对象锁,非静态方法的对象锁是Thsi,而静态方法的对象锁为(类名.class)
3.Lock锁
Lock锁是从JAVA1.5开始引入的,他可以自己设置加锁的位置,和释放锁的位置. 通过对象.lock()方法可以实现加锁操作,还可以通过对象.unlock()方法实现解锁操作.
4.sleep()方法和wait()方法的区别?
sleep()方法是休眠指定的时间,不需要其他线程唤醒的,只要指定的时间一到,那么会自动醒来,重新加入抢夺CPU执行权的大军中
而wait()方法如果不带参数的话,那么需要其他线程通过调用notify()方法或者notifyAll()方法来唤醒他.
如果wait()方法中带了参数,如果其他线程没有唤醒他,那么他到指定的时间以后也能自己醒来. |
|