Java程序运行时:jvm会自动创建主线程,执行main方法;在主线程中创建的线程是子线程;
1.2)线程通过线程id和名称区分:
1.1) Thread.currentThread().getId(); 1.2) Thread.currentThread().getName()
二)多线程的创建方式:
Java多线程的创建方式有三种:
①,继承Thread类;
②,实现Runnable接口;
③,实现Callable接口;
3.1 继承Thread类1. 定义一个类,继承自Thread类,并重写该类的run方法;( 该run方法的方法体就代表了线程需要完成的任务,因此,run方法的方法体被称为线程执行体。)
2. 创建Thread子类的对象,即创建了子线程;
3. 用上一步创建好的线程对象的start方法来启动该线程;
3.2 实现Runnable接口第一种方式:
1. 定义一个Runnable接口的实现类,并重写该接口中的run方法,该run方法的方法体同样是该线程的线程执行体;
2. 创建Runnable实现类的实例对象,并以此实例对象作为Thread类的构造函数的参数,来进行创建Thread类的对象,该Thread对象才是真正的线程对象;
3. 调用线程对象的start方法来启动该线程;
第二种方式:
1. 继承Runnable接口,并重写run方法;
2. 实例化Runnable接口的实现类;
3. 创建Thread类的对象,同时,将第二步中实例化过Runnable接口的实现类的对象,作为Thread(构造函数)的实例化时的参数,给传进去;
4. 最后启动Thread类实例化过的对象就可以了,即start()方法;
5. 例如:
// 这是一个匿名内部类,这个ticket就是Runnable的实现类(这个类是看不见的)的实例化对象;
Runnable ticket=new Runnable( ) {
public void run( ) { …… } // run方法体为该线程的线程执行体
};
// 以此实例(即ticket)作为Thread类的构造函数的参数,进行创建Thread的对象,创建出来的这个对象才是真正的线程对象;
new Thread(ticket).start();
3.3 实现Callable接口(了解)
3.4 继承Thread类与实现Runnable接口的比较:
3.4.1)继承Thread类的方式
- 没有资源共享,编写简单; - 弊端:因为线程类已经继承了Thread类,则不能再继承其他类【单继承】
3.4.2)实现Runnable接口的方式- 可以多个线程共享同一个资源,所以非常适合多个线程来处理同一份资源的情况; - 弊端:编程稍微复杂,不直观,如果要访问当前线程,必须使用Thread.currentThread()。
3.4.3)总结:- 实际上大多数的多线程应用,都采用实现Runnable接口的方式来实现【推荐使用匿名内部类】。



