Java基础巩固系列 继承与实现的方式创建多线程

继承的方式:

//创建线程的方式一:继承于Thread类
public class TestThread2 {
    public static void main(String[] args) {
        PrintNum p1 = new PrintNum("线程1");
        PrintNum p2 = new PrintNum("线程2");
        p1.setPriority(Thread.MAX_PRIORITY);//10
        p2.setPriority(Thread.MIN_PRIORITY);//1
        p1.start();
        p2.start();
    }
}

class PrintNum extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }

    public PrintNum(String name) {
        super(name);
    }
}

结果:

线程1:2
线程1:4
线程1:6
线程1:8
线程1:10
线程1:12
线程1:14
线程1:16
线程1:18
线程1:20
线程1:22
线程1:24
线程1:26
线程1:28
线程1:30
线程1:32
线程1:34
线程1:36
线程1:38
线程1:40
线程1:42
线程1:44
线程1:46
线程1:48
线程1:50
线程1:52
线程1:54
线程1:56
线程1:58
线程1:60
线程1:62
线程1:64
线程1:66
线程1:68
线程1:70
线程1:72
线程1:74
线程1:76
线程1:78
线程1:80
线程1:82
线程1:84
线程1:86
线程1:88
线程1:90
线程1:92
线程1:94
线程1:96
线程1:98
线程1:100
线程2:2
线程2:4
线程2:6
线程2:8
线程2:10
线程2:12
线程2:14
线程2:16
线程2:18
线程2:20
线程2:22
线程2:24
线程2:26
线程2:28
线程2:30
线程2:32
线程2:34
线程2:36
线程2:38
线程2:40
线程2:42
线程2:44
线程2:46
线程2:48
线程2:50
线程2:52
线程2:54
线程2:56
线程2:58
线程2:60
线程2:62
线程2:64
线程2:66
线程2:68
线程2:70
线程2:72
线程2:74
线程2:76
线程2:78
线程2:80
线程2:82
线程2:84
线程2:86
线程2:88
线程2:90
线程2:92
线程2:94
线程2:96
线程2:98
线程2:100

实现的方式: 

//创建多线程的方式二:通过实现的方式
/**
 *  对比提一下继承的方式 VS 实现的方式
 * 1.联系: public class Thread implements Runnable
 * 2.哪个方式好?实现的方式优于继承的方式
 *      why?  1.避免了java中单继承的局限性  2.如果多个线程要操作同一份资源(或数据),更适合使用实现的方式
 * */
public class TestThread3 {
    public static void main(String[] args) {
        //3.创建一个Runnable接口实现类的对象
        PrintNum1 p = new PrintNum1();
//        p.start();  不行
//        p.run();    不行
        //要想启动一个多线程,必须调用start();

        //4.将此对象作为形参传递给Thread类的构造器中,创建Thread类的对象,此对象即为一个线程
        Thread t1 = new Thread(p);
        //5.调用start()方法,启动线程并执行run()
        t1.start(); //启动线程,执行Thread对象生成时构造器形参的对象的run()方法

        //再创建一个线程
        Thread t2 = new Thread(p);
        t2.start();
    }
}

// 1.创建一个实现了Runnable接口的类
class PrintNum1 implements Runnable {

    //2.实现接口的抽象方法
    @Override
    public void run() {
        //子线程执行的代码
        for (int i = 1; i <= 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}

结果:

Thread-0:2
Thread-0:4
Thread-0:6
Thread-0:8
Thread-0:10
Thread-0:12
Thread-0:14
Thread-0:16
Thread-0:18
Thread-0:20
Thread-0:22
Thread-0:24
Thread-0:26
Thread-0:28
Thread-0:30
Thread-0:32
Thread-0:34
Thread-0:36
Thread-0:38
Thread-0:40
Thread-0:42
Thread-0:44
Thread-0:46
Thread-0:48
Thread-0:50
Thread-0:52
Thread-0:54
Thread-0:56
Thread-0:58
Thread-0:60
Thread-0:62
Thread-0:64
Thread-0:66
Thread-0:68
Thread-0:70
Thread-0:72
Thread-0:74
Thread-0:76
Thread-0:78
Thread-0:80
Thread-0:82
Thread-0:84
Thread-0:86
Thread-0:88
Thread-0:90
Thread-0:92
Thread-0:94
Thread-0:96
Thread-0:98
Thread-1:2
Thread-0:100
Thread-1:4
Thread-1:6
Thread-1:8
Thread-1:10
Thread-1:12
Thread-1:14
Thread-1:16
Thread-1:18
Thread-1:20
Thread-1:22
Thread-1:24
Thread-1:26
Thread-1:28
Thread-1:30
Thread-1:32
Thread-1:34
Thread-1:36
Thread-1:38
Thread-1:40
Thread-1:42
Thread-1:44
Thread-1:46
Thread-1:48
Thread-1:50
Thread-1:52
Thread-1:54
Thread-1:56
Thread-1:58
Thread-1:60
Thread-1:62
Thread-1:64
Thread-1:66
Thread-1:68
Thread-1:70
Thread-1:72
Thread-1:74
Thread-1:76
Thread-1:78
Thread-1:80
Thread-1:82
Thread-1:84
Thread-1:86
Thread-1:88
Thread-1:90
Thread-1:92
Thread-1:94
Thread-1:96
Thread-1:98
Thread-1:100

猜你喜欢

转载自blog.csdn.net/Peter__Li/article/details/89056670