多线程thread定义方法

时间:2024-4-3    作者:老大夫    分类: JAVA


两种创建多线程方式

  1. 继承Thread类
  2. 实现Runnable接口

继承thread类

  1. 创建一个继承Thread类的子类
  2. 重写Thread类的run()方法
  3. 创建当前Thread类子类的对象
  4. 通过对象调用start方法
public class EvenNumberTest {
    public static void main(String[] args) {
        //3.创建Thread子类对象
        PrintNumber p1=new PrintNumber();
        //4.执行start()方法
        p1.start();

        //主线程输出带*的数字,对照看是否有交叠
        for (int i = 0; i < 1000; i++) {
            System.out.println(i+"*************");
        }
    }
}
//1.继承Thread类
class PrintNumber extends Thread{
    //2.重写run()方法
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            if(i%2==0){
                System.out.println(i);
            }
        }
    }
}

问:是否可以使用run()代替start()方法?

不可以,这样会仍然执行main线程,run()被看作一个普通方法。

问:再提供一个分线程用于1000内偶数的遍历,再多一个start()操作?

不可以,第一个线程操作时线程状态会改变,再进入该线程会报错。
正确方法:再创建一个对象执行start()

实现Runnable接口

  1. 创建一个实现Runnable接口的类
  2. 实现接口中的run()方法,将需要的操作写在run()方法中
  3. 创建当前实现类的对象
  4. 将此对象作为参数传递到Thread类的构造器中,创建Thread实例
  5. Thread类的实例调用start()方法
public class EvenNumberTest {
    public static void main(String[] args) {
        //3.创建Thread子类对象
        PrintNumber p1=new PrintNumber();
        //4.创建Thread类的对象,将接口实现类的子对象作为参数传入
        Thread t1=new Thread(p1);
        //5.Thread类的对象,执行start()
        t1.start();
    }
}

//1.创建实现Runnable接口的类
class PrintNumber implements Runnable{
    //2.实现run()方法
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            if(i%2==0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}

总结

Thread继承 Runnable实现
start()方法启动 start()方法启动
创建对象是Thread子类对象 创建对象是Thread子类对象
类的继承,只能单继承 接口的实现,可以接口多实现
更适合处理有共享数据的问题
实现了代码与数据的分离
Thread类也是实现了Runnable接口(代理模式)


扫描二维码,在手机上阅读

推荐阅读: