Thread 线程常用的两种创建方式

Thread 线程常用的两种创建方式

相关的方法

Thread() - 使用无参方式构造对象。
Thread(String name) - 根据参数指定的名称构造对象。
Thread(Runnable target) - 根据参数指定的接口引用构造对象。
Thread(Runnable target, String name) - 根据引用和名称构造对象。

void run()
- 当线程对象是采用Runnable引用构造时,则最终调用Runnable引用指向的run方法。
- 否则调用该方法则表示什么也不做。
void start()
- 用于启动线程,Java虚拟机会自动调用该线程的run()方法。

原理分析

a.执行main()方法的线程叫做主线程,执行run()方法的线程叫做新/子线程。
b.对于start()方法之前的代码来说,由主线程执行一次,当start()方法调用成功之后,则线程的个数瞬间由1个变成了2个,其中新启动的线程去执行run()方法,而主线程继续向下执行,两个线程各自独立运行。
c.当run()方法结束后,则子线程终止;当main()方法结束后,则主线程结束。

注意:
线程创建的方式一相对来说代码简单,但该类继承Thread类后就无法继承其它类,而创建的方式二相对代码复杂,但不影响该类继承其它类以及实现其它接口,因此推荐第二种方式。

线程的主要状态

新建状态 - 当使用new关键字创建对象之后进入的状态。
- 此时线程还没有开始执行。
就绪状态 - 当线程对象调用start()方法后进入的状态。
- 此时线程依然没有开始执行。
运行状态 - 当就绪的线程被线程调度器调度之后进入的状态。
- 此时线程开始执行。
- 当线程的时间片执行完毕但任务还没有完成时回到就绪状态。
消亡状态 - 当线程的时间片执行完毕且任务已经完成后进入的状态。
- 此时线程已经终止。
阻塞状态 - 当线程执行的过程中发生阻塞事件后进入的状态,如:调用sleep()方法。
- 当阻塞状态被解除之后则回到就绪状态。

1,自定义类继承Thread类并重写run()方法,然后创建该类的对象并重写start()方法

因为Thread 类里面实现了Runnable接口
public class TestThread extends Thread{

@Override
public void run(){
	for(int i=0; i<20; i++){
		System.out.println("run方法中:i=" +i);
	}
}
public static void main(String[] args) {
	//使用子类类型的引用指向子类自己的对象,没有多态
	TestThread test = new TestThread();
	//调用run()本质就是成员方法的调用机制,该方法实际没有启动线程,还是会按照顺序执行
	//test.run(); 
	//调用start()方法,该方法启动线程,执行顺序是随机的
	test.start();
	for(int i=0; i<20; i++){
		System.out.println("--------main方法中:i=" +i);
	}

}

}

2.自定义类实现Runnable接口并重写run()方法,然后创建该类对象作为实参构造

Thread类的对象,最后使用Thread类对象调用start()方法。

public class TestSubRunnableStart implements Runnable {

@Override
public void run() {
	for(int i = 0; i < 20; i++){
		System.out.println("run方法中:i = " + i);
	}
}

public static void main(String[] args) {
	
	//1.创建TestSubRunnableStart类型的对象
	TestSubRunnableStart tsrs = new TestSubRunnableStart();
	//2.作为实参来构造Thread类型的对象
	Thread t1 = new Thread(tsrs);
	//3.使用Thread类型的对象调用start()方法
	t1.start();
	
	for(int i = 0; i < 20; i++){
		System.out.println("------------main方法中:i = " + i);
	}
}

}

猜你喜欢

转载自blog.csdn.net/weixin_44190511/article/details/85260014