Java语言学习总结 扩展篇 创建多线程的第二种方法,使用Runnable包,重写run方法

创建多线程

步骤如下:

  1. 定义一个Runnable接口的实现类,并重写接口中的run()方法,该run()方法的方法体同样是该线程的线程执行体。
  2. 创建Runnable实现类的实例,并且以此实例为Thrad的target来创建Thread对象,该Thread对象才是真正的线程对象。
  3. 调用线程对象start()方法来启动线程。

Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。

实现步骤:

  1. 创建一个Runnable接口的实现类
  2. 在实现类中重写Runnable接口的run()方法,设置线程任务
  3. 创建一个Runnable接口的实现类对象
  4. 创建Thread类对象,构造方法中传递Runnable接口的实现类对象
  5. 调用Thread类中的start方法,开启新线程执行run方法。

实例代码:

//创建一个Runnable接口的实现类 
public class RunnableClass implements Runnable{
	//在实现类中重写Runnable接口的run()方法,设置线程任务
	//线程任务是循环输出线程名称
	@Override
	public void run() {
		for(int i=0;i<6;i++) {
			System.out.println(Thread.currentThread().getName()+ "-->" + i);
		}
		
	}
}

public class Test {
	public static void main(String[] args) {
		//创建一个Runnable接口的实现类对象
		RunnableClass run = new RunnableClass();
		//创建Thread类对象,构造方法中传递Runnable接口的实现类对象
		Thread t = new Thread(run);
		//调用Thread类中的start方法,开启新线程执行run方法。
		t.start();
		
		for(int i=0;i<6;i++) {
			System.out.println(Thread.currentThread().getName() + " --->" + i);
		}
	}
}

输出结构:
输出结果

Thread和Runnable的区别

实现Runnable接口创建多线程的好处:

  1. 避免了单继承的局限性,因为一个类只能继承一个父类,所以如果用Thraed就不能再继承别的类,而Runnable是接口,实现接口还可以继承别的类
  2. 增强了程序的扩展性,需要使用Runnable定义的多线程时,只需在Thread对象的构造方法中传递Runnable实现类的对象。把设置线程任务和开启新线程进行了分离。降低了程序的耦合性。

匿名内部类方式实现线程的创建

匿名:即没有定义名字
内部类:写在其他类内部的类
主要目的是简化代码;把子类继承父类,重写父类方法,创建子类对象集合到一步中完成。
把实现类实现接口,重写接口中的方法,创建实现类对象合成一步完成。 匿名内部类的最终产物:子类/实现类对象,而这个类的没有名字。

实例代码:

public class ThreadInClass {

	public static void main(String[] args) {
		//线程的父类是Thread类
		new Thread() {
			//重写run方法,设置线程任务
			@Override
			public void run() {
				for(int i=0;i<=6;i++) {
					System.out.println(Thread.currentThread().getName() + "--->" + "第一个线程");
				}
				
			}
		}.start();
		
		//线程的接口Runnable
		//
		Runnable r = new Runnable() {
			@Override
			public void run() {
				for(int i=0;i<=6;i++){
					System.out.println(Thread.currentThread().getName() + " --> " + "第二个线程");
				}
			}
		};
		new Thread(r).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=0;i<=6;i++){
					System.out.println(Thread.currentThread().getName() + " --> " + "第三个线程");
				}
			}
		}).start();
	}
}
发布了72 篇原创文章 · 获赞 3 · 访问量 6180

猜你喜欢

转载自blog.csdn.net/Ace_bb/article/details/104180865