【Java多线程】什么是线程与线程的生命周期与线程的创建方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HTN_MK/article/details/77463666

Q:什么是进程和线程?

A:进程是所有线程的集合,每一个线程是进程中的一条执行路径,main也是线程,是主线程。

PS:线程之间互不干扰。

Q:为什么使用多线程?

A:提高应用程序的效率,比如下载软件的多下载任务可同时进行就是应用了多线程。

1.线程的生命周期


线程生命周期中有五个状态
a)创建(new Thread)
当用new操作符创建一个新的线程对象时,该线程处于创建状态。
处于创建状态的线程只是一个空的线程对象,系统不为它分配资源。

b)就绪(runnable)
线程已经准备就绪,等待CPU为其分配资源。
start()即就绪。

c)运行(running)
线程获得CPU资源,正在按顺序执行代码。

d)阻塞(blocked)
因sleep()或wait()或其他线程join()等而使线程暂停执行让出资源进入等待,即阻塞。
sleep()时间结束或被唤醒nontify()或其他线程执行完毕,线程由阻塞状态进入就绪状态。

e)消亡(dead)
线程执行完毕,或被杀死,即进入消亡状态。

2.创建线程的三种方法

a)继承Thread类
ThreadDemo1.java
public class ThreadDemo1 extends Thread{
	// 继承Thread类的线程类应重写run方法,在run方法中写入需要线程所运行的方法。
	@Override
	public void run() {
		for(int i = 0; i < 100; i++) {
			System.out.println("run i = " + i);
		}
	}
	public static void main(String[] args) {
		// 直接创建继承了Thread类的实例对象
		ThreadDemo threadDemo = new ThreadDemo();
		// 开始线程应当调用start()而不是调用run(),否则任然是顺序执行而不是同时执行。
		threadDemo.start();
		for(int i = 0; i < 100; i++) {
			System.out.println("main i = " + i);
		}
	}
}

结果片段
main i = 0
run i = 0
main i = 1
run i = 1
main i = 2
run i = 2
main i = 3
run i = 3
main i = 4
run i = 4
run i = 5
run i = 6
run i = 7
run i = 8
run i = 9
run i = 10
main i = 5
run i = 11
main i = 6
run i = 12
可以看出两个线程之间并不是完全交替执行,有时会某个线程多执行一会,实际上是由CPU随机分配资源提供执行机会。

b)实现Runnable接口
ThreadDemo2.java
public class ThreadDemo2 {
	public static void main(String[] args) {
		// 创建实现了Runnable的线程类的实例对象
		NewThread newThread = new NewThread();
		// 创建Thread类的实例对象,传入newThread。
		Thread t = new Thread(newThread);
		// 调用start()方法开始线程
		t.start();
		for(int i = 0; i < 100; i++) {
			System.out.println("main i = " + i);
		}
	}
}

class NewThread implements Runnable{
	// 实现Runnable的线程类必须重写run()方法。
	@Override
	public void run() {
		for(int i = 0; i < 100; i++) {
			System.out.println("run i = " + i);
		}
	}
}
PS:由于java单继承多实现的特性,所以建议使用实现Runnable接口的方法创建线程。

c)使用匿名类
ThreadDemo3.java
public class ThreadDemo3 {
	public static void main(String[] args) {
		// 传入一个重写了run()方法的Runnable对象,直接调用start()。
		new Thread(new Runnable(){
			@Override
			public void run() {
				for(int i = 0; i < 100; i++) {
					System.out.println("run i = " + i);
				}
			}
		}).start();
		
		for(int i = 0; i < 100; i++) {
			System.out.println("main i = " + i);
		}
	}
}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页