1.*一个程序运行后至少有一个进程,一个进程里可以包含多个线程,但至少要包含一个线程。*
- package bin;
- public class FirstThread extends Thread
- {
- private int i;
- //重写run方法
- public void run()
- {
- for(;i < 100;i++)
- {
- /*当线程类继承Thread类时,可以直接调用getName()方法来返回当前线程的名。
- 如果想获取当前线程,直接使用this即可
- Thread对象的getName()返回当前该线程的名字。
- */
- System.out.println(getName() + " " + i);
- }
- }
- public static void main(String[] args)
- {
- for(int i=0;i < 100; i++)
- {
- //调用Thread的currentThread方法获取当前线程
- System.out.println(Thread.currentThread().getName() + " " + i );
- if(i == 20)
- {
- //创建启动第一个线程
- new FirstThread().start();
- //创建启动第二个线程
- new FirstThread().start();
- }
- }
- }
- }
- Thread.currentThread():currentThread是Thread类的静态方法,该方法总是返回当前正在执行的线程对象。 getName():该方法是Thread的实例方法,该方法返回调用该方法的线程的名字。
实现线程的方法二: 实现Runnable接口创建线程类
1.定义Runnable接口的实现类,并重写该接口的run方法,该run方法的方法体是该线程的线程执行体。
2.创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
3.调用线程对象的start方法来启动线程。
例:
- //创建Runnable实现类的对象
- SecondThread st = new SecondThread();
- //以Runnable实现类的对象作为Thread的target来创建Thread对象,即线程对象
- new Thread(st);//或new Thread(st,"新线程1");直接指定一个名字
注意:
Runnable对象仅仅作为Thread对象的target,Runnable实现类里包含的run方法 仅作为线程执行体。而实际的线程对象依然是Thread实例,只是该Thread 线程负责执行其target的run方法。java语言的Thread必须使用Runnable对象的run方法作为线程执行体。
例:
- package bin;
- public class SecondThread implements Runnable
- {
- private int i;
- public void run()
- {
- for(;i<100;i++)
- {
- System.out.println(Thread.currentThread().getName() + " " + i);
- }
- }
- public static void main(String[] args)
- {
- for(int i =0;i<100;i++)
- {
- System.out.println(Thread.currentThread().getName() + " " + i);
- if(i==20)
- {
- SecondThread st = new SecondThread();
- new Thread(st,"新线程1").start();
- new Thread(st,"新线程2").start();
- }
- }
- }
- }
- /* 结果:两条子线程的i变量是连续的,也就是采用Runnable接口的方式创建的多条线程
- 可以共享线程类的实例属性。 因为:程序创建的Runnable对象只是线程的target,而多线程可以共享
- 同一个target,所以多线程可以共享同一个线程类(实际上应该是线程的target类)的实力属性。 */
对比FirstThread和SecondThread中的run方法 :
使用继承Thread时获取当前线程对象比较简单,直接使用this就可以 但使用实现Runnable接口时要获得当前线程对象必须使用Thread.currentThread()方法。
注:
1.启动线程使用start方法,而不是run方法,永远不要调用线程对象的run方法!调用start方法来启动线程,系统会把该run方法当成线程执行体来处理,但如果直接调用run方法,则run方法直接就会被执行,而且在run方法返回之前其他线程无法并发执行(系统当成普通对象执行,而不是线程执行体)。
2.不要对处于死亡状态的线程调用start()方法,程序只能对新建状态的线程调用start()方法,对于新建状态的线程两次调用start()方法也是错误的。