步骤:
1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把
run()方法称为线程执行体。
2. 创建Thread子类的实例,即创建了线程对象
3. 调用线程对象的start()方法来启动该线程
注意点:
多次启动一个线程是非法的,特别是当线程已经结束执行后,不能再重新启动

image.png

image.png
多线程内存图解
1.0Thread类常用方法
构造方法
public Thread() :分配一个新的线程对象。
public Thread(String name) :分配一个指定名字的新的线程对象。
public Thread(Runnable target) :分配一个带有指定目标新的线程对象。
public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字。
常用方法
public String getName() :获取当前线程名称。
public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。
public void run() :此线程要执行的任务在此处定义代码。
public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
public static Thread currentThread() :返回对当前正在执行的线程对象的引用。
注意:
由于主线程没有基础Thread类,所以想要获得主线程的名称,不能直接调用
getName()方法,而是要通过Thread.currentThread().getName()来获取!
1.1Thread实现1
class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
public void run() {
for(int i=0;i<=10;i++) {
System.out.println(getName()+"正在运行"+i);
}
}
}
public class ThreadTest{
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("主线程1");
MyThread mt1 = new MyThread("线程1");
MyThread mt2 = new MyThread("线程2");
mt1.start();//默认执行run()
mt2.start();//默认执行run()
System.out.println("主线程2");
}
}
1.2.通过实现runnable接口来实现线程
好处:降低了程序的耦合性,增加了扩展性,将设置线程任务与开启新线程进行了分离,可以继承多的父类,实现其他接口
class PrintRunable implements Runnable{
@Override
public void run() {//设置线程任务
int i= 1;
while(i<=10)
System.out.println(Thread.currentThread().getName()+"正在运行"+(i++));
}
}
public class ThreadTest{
public static void main(String[] args) {
// TODO 自动生成的方法存根
PrintRunable pr = new PrintRunable();
Thread t1 = new Thread(pr);//开启新线程
t1.start();
PrintRunable pr1 = new PrintRunable();
Thread t2 = new Thread(pr1);
t2.start();
}
}
通过thread可以共享线程(共享数据i)
class PrintRunable implements Runnable{
int i= 1;
@Override
public void run() {
while(i<=10)
System.out.println(Thread.currentThread().getName()+"正在运行"+(i++));
}
}
public class ThreadTest{
public static void main(String[] args) {
// TODO 自动生成的方法存根
PrintRunable pr = new PrintRunable();
Thread t1 = new Thread(pr);
t1.start();
//PrintRunable pr1 = new PrintRunable();
Thread t2 = new Thread(pr);
t2.start();
}
}
1.3匿名内部类
格式:
new 父类/接口 (){
重写父类/接口中的方法
}
public class NoNameInnerClassThread {
public static void main(String[] args) {
// new Runnable(){
// public void run(){
// for (int i = 0; i < 20; i++) {
// System.out.println("张宇:"+i);
// }
// }
// }; //‐‐‐这个整体 相当于new MyRunnable()
Runnable r = new Runnable(){
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println("张宇:"+i);
}
}
};
new Thread(r).start();