java中有两种方式进行线程的创建
1. 继承thread类创建线程类
步骤:重写Thread类的run方法,也就是线程执行体;创建Thread的子类,也就是创建线程对象;调用start方法记性启动。
//通过继承Thread类来创建线程类
public class FirstThread extends Thread{
private int i ;
//重写run方法,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-0 53
Thread-1 4
Thread-0 54
main 25
Thread-0 55
Thread-1 5
Thread-0 56
Thread-0 57
可以发现:创建的2个线程是没有共享一个i数据的
2. 实现Runnable接口创建创建线程类
创建步骤:编写实现Runnable接口的实现类;并重写run方法,也就是线程执行体;创建该实现类的实例对象,以此作为Thread的target进行Thread对象的创建,此时的对象才是真正的线程对象
//通过实现Runnable接口来创建线程类
public class SecondThread implements Runnable
{
private int i ;
//run方法同样是线程执行体
public void run()
{
for ( i=0; i < 100 ; i++ )
{
//当线程类实现Runnable接口时,
//如果想获取当前线程,只能用Thread.currentThread()方法。
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(target , name)方法创建新线程
new Thread(st , "新线程1").start();
new Thread(st , "新线程2").start();
}
}
}
}
结果:新线程1 52
新线程2 51
新线程1 53
main 31
新线程1 55
新线程2 54
新线程1 56
可以发现,两个线程对象是共享一个数据资源的
总结:比较两种方式的区别
Thread方式:已经继承了THread类,所以不能继承其他父类,但是编写简单
Runnable方式:实现了Runnable接口,还可以继承其他类;可以多个线程共享同一份资源;编写相对复杂
而事实上,普遍都使用实现runnable方式去进行多线程应用开发。