第八章 多线程 3 - 创建多线程的两种方式
作者:互联网
创建多线程的两种方式
方式一:继承Thread类的方式
- 创建一个继承Thread类的子类
- 重写Thread类中的run() --> 将执行代码逻辑声明在run()中
- 创建Thread类的子类对象
- 通过此对象调用start(): ① 启动当前线程 ② 调用当前线程的run()
【代码】
public class ThreadDemo {
public static void main(String[] args) {
//设置线程名字,不设置则使用默认构造 0 1 2 3...这样
Thread.currentThread().setName("主线程");
MyThread myThread = new MyThread();
myThread.setName("子线程:");
//开启线程
myThread.start();
for(int i = 0;i<5;i++){
System.out.println(Thread.currentThread().getName() + i);
}
}
}
//实现方式之继承Thread
class MyThread extends Thread{
//重写run()方法
public void run(){
for(int i = 0;i < 5; i++){
System.out.println(Thread.currentThread().getName() + i);
}
}
}
//注意:由执行结果可以看出,并非按照顺序,而是通过抢占cpu资源,抢到则执行。
执行结果:
main thread0
子线程:0
子线程:1
子线程:2
main thread1
子线程:3
main thread2
子线程:4
main thread3
main thread4
说明两个问题:
问题一:我们启动一个线程,必须要调用start(),不能调用run()的方式启动线程
问题二:如果再启动一个线程,必须重新创建一个Thread子类的对象,调用此对象的start()
方式二:实现Runnable接口的方式
- 创建一个实现了Runnable接口的类
- 实现类去实现Runnable中的抽象方法:run()
- 创建实现类的对象
- 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
- 通过Thread类的对象调用start()
【代码】
public class RunnableDemo {
public static void main(String[] args) {
//设置线程名字,不设置则使用默认构造 0 1 2 3...这样
Thread.currentThread().setName("主线程");
Thread myThread = new Thread(new MyRunnable());//作为参数传入
myThread.setName("实现Runnable接口方式,子线程:");
//开启线程
myThread.start();
for(int i = 0;i<5;i++){
System.out.println(Thread.currentThread().getName() + i);
}
}
}
//实现方式之实现Runnable
class MyRunnable implements Runnable{
//重写run()方法
public void run(){
for(int i = 0;i < 5; i++){
System.out.println(Thread.currentThread().getName() + i);
}
}
}
执行结果:
主线程0
实现Runnable接口方式,子线程:0
实现Runnable接口方式,子线程:1
实现Runnable接口方式,子线程:2
主线程1
实现Runnable接口方式,子线程:3
实现Runnable接口方式,子线程:4
主线程2
主线程3
主线程4
两种方法的对比:
开发中:
优先选择:实现Runnable接口的方式
原因:
- 实现的方式没有类的单继承性的局限性
- 实现方式更加适合来处理多线程共享数据的情况。
联系:public class Thread implements Runnable
相同点:
两个方式都需要重写run(),将线程要执行的逻辑代码声明在run()中。
目前两种方式,要想启动线程,都是调用的Thread类中的start().
标签:main,Runnable,run,Thread,创建,第八章,start,线程,多线程 来源: https://www.cnblogs.com/anjiaxiaopihai/p/16372520.html