重温java知识(三十七、多线程编程之二:Runnable接口实现多线程)

面向对象的程序设计通过接口实现标准定义与解耦和操作,所以多线程又提供类Runnable接口实现多线程开发。
使用Thread类的确可以方便地实现多线程,但是这种 方式最大的缺点就是单继承局限。因此在java中可以利用Runnable接口来实现多线程,该接口的定义如下:

@FunctionalInterface    // 从JDK8引入类Lambda表达式后就变为类函数式接口
public interface Runnable {
    public void run();
}

1、Runnable接口实现多线程的例子:

package com.mydemo;

public class ThreadDemo {

    public static void main(String[] args) {

        /**
         * 实现类Runnable接口后,则MyThread类中将不再提供start()方法,
         * 所以为了继续使用Thread类启动多线程,
         * 此时就可以利用Thread类中的构造方法进行线程对象的包裹
         * Thread类构造方法:public Thread(Runnable target);
         */
        // 一个线程对象只能启动唯一的一次
        Thread threadA = new Thread(new MyThread("线程A"));
        Thread threadB = new Thread(new MyThread("线程B"));
        Thread threadC = new Thread(new MyThread("线程C"));
        Thread threadD = new Thread(new MyThread("线程D"));
        Thread threadE = new Thread(new MyThread("线程E"));

        threadA.start();
        threadB.start();
        threadC.start();
        threadD.start();
        threadE.start();


        /**
         * 通过Lambda表达式定义线程主体
         */
        for (int i = 0; i < 5; i++) {
            String title = "【Lambda】线程对象-" + i;
            new Thread(() -> {
                for (int j = 0; j < 3; j++) {
                    System.out.println(title + "运行, j = " + j);
                }
            }).start();
        }
    }
}

class MyThread implements Runnable {
    private String title;

    /**
     * 构造函数
     * 属性初始化
     */
    public MyThread(String title) {
        this.title = title;
    }

    /**
     * 方法覆写
     * <p>
     * 线程启动后,会默认调用run()方法
     */
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(this.title + "运行, i = " + i);
        }
    }
}

运行结果:
线程B运行, i = 0
线程B运行, i = 1
线程B运行, i = 2
线程B运行, i = 3
线程B运行, i = 4
......
【Lambda】线程对象-1运行, j = 0
【Lambda】线程对象-1运行, j = 1
【Lambda】线程对象-1运行, j = 2
【Lambda】线程对象-2运行, j = 0
【Lambda】线程对象-2运行, j = 1
......

2、并发资源访问的例子:

package com.mydemo;

public class ThreadDemo {

    public static void main(String[] args) {

        // 定义资源对象
        MyThread mt = new MyThread();

        new Thread(mt).start();     // 第一个线程启动
        new Thread(mt).start();     // 第二个线程启动
        new Thread(mt).start();     // 第三个线程启动
    }
}

class MyThread implements Runnable {

    // 定义总票数
    private int ticket = 5;

    /**
     * 方法覆写
     * <p>
     * 线程启动后,会默认调用run()方法
     */
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (this.ticket > 0) {
                System.out.println("卖票,ticket = " + this.ticket--);
            }
        }
    }
}
运行结果:
卖票,ticket = 4
卖票,ticket = 3
卖票,ticket = 5
卖票,ticket = 1
卖票,ticket = 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值