Java语法进阶10-多线程
当运行Java程序时,其实已经有一个线程了,那就是main线程。
所有的线程对象都必须是Thread类或其子类的实例,
-
定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。
-
创建Thread子类的实例,即创建了线程对象
-
调用线程对象的start()方法来启动该线程
步骤如下:
-
定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
-
创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正 的线程对象。
-
调用线程对象的start()方法来启动线程。
例: public class MyRunnable implements Runnable //定义实现线程类
MyRunnable mr = new MyRunnable(); //创建线程对象
Thread t = new Thread(mr); //通过Thread类的实例,启动线程
t.start();
实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是继承Thread类还是实现
tips:Runnable对象仅仅作为Thread对象的target,Runnable实现类里包含的run()方法仅作为线程执行体。 而实际的线程对象依然是Thread实例,只是该Thread线程负责执行其target的run()方法。
1、继承的方式有单继承的限制,实现的方式可以多实现
2、启动方式不同
3、继承:在实现共享数据时,可能需要静态的
实现:只要共享同一个Runnable实现类的对象即可。
4、继承:选择锁时this可能不能用,
实现:选择锁时this可以用。
new Thread("新的线程!"){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName()+":正在执行!"+i);
}
}
}.start();
守护线程有个特点,就是如果所有非守护线程都死亡,那么守护线程自动死亡。
调用setDaemon(true)方法可将指定线程设置为守护线程。必须在线程启动之前设置,否则会报IllegalThreadStateException异常。