多线程创建的两种方式
一、继承Thread类
1.定义一个子类,继承Thread类
2.重写run()方法,将线程要完成的任务的代码放到其中
3.创建定义的子类线程的对象
4.调用start()启动线程
示例:
//1.定义一个子类,继承Thread类
public class MyThread extends Thread {
//2.重写run()方法,将线程要完成的任务的代码放到其中
@Override
public void run() {
for(int i=0;i<5;i++) {
System.out.println(getName()+"===MyThread线程===");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
//3.创建定义的线程的对象
MyThread myThread = new MyThread();
//4.调用start()启动线程
myThread.start();
for(int i=0;i<5;i++) {
System.out.println(Thread.currentThread().getName()+"===主线程===");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果:
由于线程对CPU资源的抢占是随机的,所以多次运行结果可能不同。
二、实现Runnable接口
1.定义一个类实现Runnable接口
2.重写run()方法
3.创建实例化对象
4.创建Thread对象,并将Runnable的实例作为参数传递给构造器
5.调用start()启动线程
示例:
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+":==MyRunnable==");
}
}
}
public class ThreadDemo2 {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread t1 = new Thread(runnable);
t1.start();
Thread t2 = new Thread(runnable);
t2.start();
}
}
输出结果:
同样的,多次运行结果也不一致。
run()和start()
1.创建线程需要重写Thread类或者Runnable接口的run()方法中,该方法中封装该线程执行的代码。
2.启动线程调用的是start()方法,该方法会让JVM先启动线程,再让线程去调用run()方法,如果直接调用run(),仅仅是普通调用。
3.使用Runnable可以弥补单继承的局限性;并且由于Runnable的实例只创建了一次,适合多个线程操作同一个资源的情况,将线程的代码和线程进行了有效的分离。