创建线程的方式:
1. 继承Thread类
(1)定义类,继承Thread
(2)复写Thread类中的void run()方法(因为Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。)
(3)调用线程的start方法,该方法能启动线程,并能调用run方法
注:对象.run()仅仅是对象调用方法。而线程创建了,并没有运行;
对象.start()开启线程并执行该线程的run方法
2. 实现Runnable接口
(1)定义类,实现Runnable接口
(2)覆盖Runnable接口中的run方法。将线程要运行的代码存放在该run方法中
(3)通过Thread类建立线程对象
(4)将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。因为,自定义的run方法所属的对象是Runnable接口的子类对象,所以要让线程去执行指定对象的run方法,就必须明确该run方法所属的对象。
(5)调用Thread类的start方法开启线程,并调用Runnable接口子类的run方法
实现方式与继承方式的区别:
实现方式好处:避免了单继承的局限性。在定义线程时,建议使用实现方式。
继承Thread:线程代码存放在Thread子类run方法中;实现Runnable:线程代码存放在接口的子类的run方法。
继承Thread类的例子
public class TestThread2 { public static void main(String[] args) { MyThread2 mt = new MyThread2(); mt.start(); for (int i = 0; i < 50; i++) { System.out.println("TestThread-----------" + i); } } } class MyThread2 extends Thread{ public void run() { for (int i = 0; i < 50; i++) { System.out.println("MyThread=========" + i); } } }
实现Runnable接口的例子:
public class TestThread { public static void main(String[] args) { MyThread mt = new MyThread(); Thread t = new Thread(mt); t.start(); // mt.run(); for (int i = 0; i < 50; i++) { System.out.println("TestThread-----------" + i); } } } class MyThread implements Runnable { public void run() { for (int i = 0; i < 50; i++) { System.out.println("MyThread=========" + i); } } }
3.线程的方法:
Join方法:线程对象.join(),当A线程执行到了B线程的.join()方法,A就会等待。等B线程都执行完,A才会执行。join可以用来临时加入线程执行。
yield方法:暂停当前正在执行的线程对象,并执行其他线程。
static Thread currentThread():获取当前线程对象
getName():获取线程名称
设置线程名称:setName()或者构造函数