创建线程的两种基本方法
一、通过继承Thread类创建线程
实现
Main方法
MyThread myThread1 = new MyThread();
myThread1.setName("thread - 1");
//start(): 执行线程
//run(): 当前线程调用
MyThread myThread2 = new MyThread();
myThread2.setName("thread - 2");
myThread1.run();
myThread2.run();
myThread1.start();
myThread2.start();
MyThread类
public class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread()+" print : hello!");
super.run();
}
}
二、通过实现Runnable接口创建线程
知识点:
- 通过实现Runnable 接口的方法实现创建线程,其基本原理是代理模式,创建的Thread 代理Runnable 接口的类,执行其自定义的方法。
- 多个线程代理同一个实现runnable接口的类时,对于其公共的资源是共享的,对于其资源的操作是多线线程的,会有线程安全问题。
实现:
MyThread 类:
public class MyThread implements Runnable {
int a = 5;
@Override
public void run() {
while (a>0){
--a;
System.out.println(a);
}
}
}
Main方法:
MyThread my = new MyThread();
Thread th1 = new Thread(my);
Thread th2 = new Thread(my);
Thread th3 = new Thread(my);
//对同一Runnable接口实现类的代理线程,对该实现类的数据操作是共享的且多线程的
th1.start();
th2.start();
th3.start();
三、通过start()方法启动线程而不是run()方法
- 通过start()在任意线程中开启以及准备好的线程,并在新的线程中执行run()方法。
- 通过调用线程(代理线程)的run()方法时,执行run()方法的就是该调用run()方法的线程,而非我们创建的线程。