JAVA多线程编程(一)——线程的创建方式
首先,多线程的创建有两种方式:
1. 继承Thread类,实现run方法; 2. 实现runnable接口
(第一种方法是不推荐的方法,因为它只能单继承,有局限性。第二种方法适合多个线去处理同一个资源的情况,把线程同程序的代码,数据有效的分离,体现了面向对像的思想)
【JDK文档: 创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。】
第一种方法创建多线程的步骤:
(1). 创建自定义的类MyThread继承Thread类;
(2). 在自定义类中Overrie/重写/实现run()方法;
(3). 创建MyThread类的对像;
(4). 启动线程对像;
注:
a: 为什么要重写run()方法? run()方法里面封装的是线程执行的代码
b: 启动线程对像时用的是哪个方法?new MyThread(). start()
c: run()和start()方法的区别? start()先启动线程然后再由JVM调用run()
典型的程序结构如下:
package Thread;
import java.lang.Thread;
class MyThread extends Thread{
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName());
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
public class ThreadTest{
public static void main(String[] args)
{
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
MyThread t3 = new MyThread();
t1.start();
t2.start();
t3.start();
}
}
第二种方法创建多线程程序的步骤:
(1). 创建自定义线程类MyThread实现Runnable接口;
(2). 在MyThread类里面Overried/重写run();
(3). 创建MyThread类的对像;
(4). 创建Thread类的对像,并把上一步中创建的对像作为构造函数参数传递;
package Thread;
class MyThread1 implements Runnable{
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName());
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
public class ThreadTest1
{
public static void main(String[] args)
{
//自定义线程,实现Runnable接口
MyThread1 t = new MyThread1();
//创建线程并把实现Runnable接口的类的对像作为参数传递
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
//启动线程
t1.start();
t2.start();
t3.start();
}
}
实现Runable接口相对于继承Thread类来说有如下优点:
1. 适合多个相同程序代码的线程去处理同一资源的情况,把虚拟的CPU(线程)同程序的代码,数据有效分离,较好的体现了面向对像的设计思想。
2. 可以避免JAVA单继承特性带来的局限。比如,一个类已继承自另一个类,而又要将这个类放入多线程中,那这个类还需要继承Thread类,但是JAVA只能单继承,所以只能用接口的方式来实现。
3. 有利于程序的健壮性,代码能够被多个线程共享,代码与数据是相互独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与他们的代码无关。当共享访问相同的对像时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对像作为构造函数实参传递进去,这个对像就是一个实现了Runnable接口的类的实例。