有两种方式可以实现多线程程序
方式1:继承Thread类。方式1的实现方法请戳链接。
https://www.jianshu.com/p/e2a065945805
方式2:实现Runnable接口。
一、线程的生命周期
新建:创建线程对象
就绪:有执行资格,没有执行权
运行:有执行资格,有执行权
阻塞:由于一些操作让线程处于了该状态。没有执行资格,没有执行权。而另一些操作却可以把它给激活,激活后处于就绪状态。
死亡:线程对象变成垃圾,等待被回收。
线程的生命周期
二、Runnable接口
步骤:
A:自定义MyRunnable实现Runnable接口
B:重写run()方法
C:创建MyRunnable的对象
D:创建Thread类的对象,并把C步骤的对象作为构造参数传递
public class MyRunnable implements Runnable{
@Override
public void run() {
for(int i = 0; i < 100; i++) {
//由于实现接口的方式就不能直接使用Thread类的方法了,但是可以间接的使用
System.out.println(Thread.currentThread().getName() + "---" + i);
}
}
}
public static void main(String[] args) {
MyRunnable my = new MyRunnable();
// Thread(Runnable target, String name)
Thread t1 = new Thread(my, "one");
Thread t2 = new Thread(my, "two");
t1.start();
t2.start();
}
可以是使用setName给线程起名字。
思考题:实现接口方式的好处是什么?
答:1、可以避免由于Java单继承带来的局限性。(因为每个子类只能继承一个父类,如果一个类已经有了一个父类了,所以它就不能继承Thread类,就无法实现多线程了。但是有了Runnable接口,它可以通过实现这个接口来实现多线程。)
2、适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码、数据有效分离,较好的体现了面向对象的设计思想。(对于继承Thread类的方法,如果这个子类里面有成员方法,由于实现这个类的时候需要new多个,所以成员方法就有多份。但是对于实现Runnable接口的方法,只需要new一个实例实现这个接口,其他的多个实现类只需要把这个接口的实例当做参数传进去即可,成员方法就只有一份了。)
网友评论