面向对象的程序设计通过接口实现标准定义与解耦和操作,所以多线程又提供类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