(Javase碎碎念1)线程创建的四种方式以及前两中的优缺点

关于线程的创建本来准备写的稍微全一点,查阅相关资料发现线程的创建竟然有四种方式(以前只知道三种)分别为(本篇博客主要讨论前两种方式):
一,继承thread类
二,实现runnable接口
三,使用callable和future
四,使用线程池如用executor框架(本条由于涉及到框架本人不了解,所以就不讨论)

一,继承thread类
1)定义thread类的子类,重写run方法,run方法里面的逻辑代码就是线程需要完成的任务.
2)创建thread子类的实例,为线程创建对象
3)调用线程的start方法来启动线程

package Demo;

public class Thread1 extends Thread {
	public static void main(String[] args) {
		Thread1 t1 = new Thread1();
		t1.start();
		System.out.println("主线程");
			}
      //需要执行的逻辑代码
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println(i);
		}
	}

}

二,实现runnable接口
1)自定义一个实现了runnable接口的类
2)重写run方法(和thread一样,传入逻辑代码)
3)创建一个该类的对象,并将该类的参数传到thread的构造器中,从而创建了一个线程
4)调用start方法,启动线程

package Demo;
public class Runnable1 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(i);
} }
public static void main(String[] args) {
Runnable1 r=new Runnable1();
new Thread(r).start();
}
}

三,使用callable(接口)和future(属于juc并发编程)
优点在于:1)call方法可以抛出异常
2)可以有返回值

一,二种方式对比:单从步骤上来看,似乎就是第一种多了创建对象的这个功能.那在看一个例子:

package Demo;

public class Thread1 extends Thread {

	public Thread1(String name) {
		super(name);

	}

	public static void main(String[] args) {
		Thread1 t1 = new Thread1("线程一");
		t1.start();
		Thread1 t2 = new Thread1("线程二");
		t2.start();
	}
	int i = 1;
	@Override
	public void run() {
		
		while (i < 10) {
			System.out.println(Thread.currentThread().getName() + (i++));
		}
	}

}

输出结果为:

线程一1
线程二1
线程一2
线程二2
线程一3
线程二3
线程一4
线程二4
线程一5
线程二5
线程一6
线程二6
线程一7
线程二7
线程一8
线程二8
线程一9
线程二9

在来看看实现了runnable接口的代码:

package Demo;

public class Runnable01 {

	public static void main(String[] args) {
		Runnable2 r = new Runnable2();
//		new Thread(r, "(--1)").start();
//		new Thread(r, "(2)").start();
		
		Thread t1 = new Thread(r, ":线程二");
		Thread t2 = new Thread(r, ":线程一");
		t1.start();
		t2.start();

	}

}

class Runnable2 implements Runnable {
	private int i = 1;
	@Override

	public void run() {
	
		while (i < 10) {
			System.out.println((i++) + Thread.currentThread().getName());
		}
	}
}

结果:

1:线程二
2:线程一
3:线程二
4:线程一
5:线程二
6:线程一
7:线程二
8:线程一
9:线程二

相信聪明的小伙伴已经看出点什么了吧!没错,实现runnable的接口可以实现资源共享,而继承thread的类不!可!以!
好滴,现在来对比一下两种方式的优缺点:
1,thread父类
1)优点:访问当前线程的属性使用this关键字即可;
2)缺点:由于Java中的单继承的特点,继承过thread的类不能在继承别的类.
1,runnable接口
1)优点:Java中的接口多继承特点,可以继续实现其他的接口和继承其他的父类;
重重重重要的一点就是他能资源共享!适合多个线程来处理同一份资源.
2)缺点:访问当前线程,必须使用thread.currentThread.

原创文章 5 获赞 5 访问量 124

猜你喜欢

转载自blog.csdn.net/weixin_46255799/article/details/106113883