本系列整理Java相关的笔试面试知识点,其他几篇文章如下:
1、实现多线程的两种方法
实现多线程有两种方法:继承Thread和实现Runnable接口。
继承Thread:
以卖票为例:
public class MyThread extends Thread {
private static int COUNT = 5;
private int ticket = COUNT;
private String name;
public MyThread(String s){
name = s;
}
@Override
public void run() {
for(int i = 0; i < COUNT; i++){
if(ticket > 0){
System.out.println(name + "-->" + ticket--);
}
}
}
测试使用:
MyThread thread1 = new MyThread("thread1");
MyThread thread2 = new MyThread("thread2");
thread1.start();
thread2.start();
输出:
thread1-->5
thread2-->5
thread1-->4
thread2-->4
thread1-->3
thread2-->3
thread1-->2
thread2-->2
thread1-->1
thread2-->1
可以看到,这种方式每个线程自己拥有了一份票的数量,没有实现票的数量共享。下面看实现Runnable的方式:
实现Runnable接口:
public class MyRunnable implements Runnable {
private static int COUNT = 5;
private int ticket = COUNT;
@Override
public void run() {
for(int i = 0; i < COUNT; i++){
if(ticket > 0){
System.out.println("ticket-->" + ticket--);
}
}
}
}
测试使用:
MyRunnable runnable = new MyRunnable();
new Thread(runnable).start();
new Thread(runnable).start();
输出:
ticket-->5
ticket-->3
ticket-->2
ticket-->1
ticket-->4
可以看到,实现Runnable的方式可以实现同一资源的共享。
实际工作中,一般使用实现Runnable接口的方式,是因为:
(1)支持多个线程去处理同一资源,同时,线程代码和数据有效分离,体现了面向对象的思想;
(2)避免了Java的单继承性,如果使用继承Thread的方式,那这个扩展类就不能再去继承其他类。
拓展:
Thread的start()和run()方法区别:
start()方法用于启动一个线程,使其处于就绪状态,得到了CPU就会执行,而直接调用run()方法,就相当于是普通的方法调用,会在主线程中直接运行,此时没有开启一个线程。
(可以看第一篇总结中,关于线程启动)
下列方法中哪个是执行线程的方法? ()
A、run() B、start() C、sleep() D、suspend()
正确答案:A
run()方法用来执行线程体中具体的内容
start()方法用来启动线程对象,使其进入就绪状态
sleep()方法用来使线程进入睡眠状态
suspend()方法用来使线程挂起,要通过resume()方法使其重新启动
2、访问控制修饰符(新补充)
关于访问控制修饰符,在第一篇总结中已有详细的介绍。但最近在使用Str