Java多线程回顾1:线程的概念及创建

1、进程与线程的概念 

现在几乎所有操作系统都支持多任务,通常一个任务就是一个程序,一个运行中的程序就是一个进程。当一个程序行时,其内部也可能在执行多个任务,进程内每一个任务的执行流,就是一个线程。

所以线程也被称作轻量级进程。

总而言之,线程是进程的组成部分,可以独立、并发的执行任务

2、线程的创建和启动

Java中有两种方式来创建和启动线程。

2.1继承Thread类创建和启动线程

通过继承Thread类创建并启动多线程的步骤如下:

1、创建Thread的子类,并重写run方法。run方法中就是线程要执行的任务,所以也把run方法称为线程执行体。

2、创建该子类的实例,即线程对象。

3、使用线程对象的start方法启动线程。

线程类代码如下:

//通过继承Thread类来创建线程类
public class ThreadOne extends Thread{
	private int i;
	
	//重写run方法,方法体就是线程要执行的任务
	@Override
	public void run() {
		for (i = 0; i < 5; i++) {
			//继承Thread类时,可以直接调用getName()方法来返回当前线程的名字
			//如果想获取当前线程,直接使用this即可
			System.out.println(getName()+" "+i);
		}
	}
}

测试代码如下:

public class TestThreadOne {
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			//打印主线线程的信息
			System.out.println(Thread.currentThread().getName()+" "+i);
			if (i==2) {
				//创建并启动第一条线程
				new ThreadOne().start();
				//创建并启动第二条线程
				new ThreadOne().start();
			}
		}
	}
}


运行结果如下:

main 0
main 1
main 2
main 3
main 4
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-1 0
Thread-1 1
Thread-1 2
Thread-1 3
Thread-1 4


从上面的运行结果可以发现,测试类只显式的创建了两条线程,但实际上有三条线程在运行,即主线程、线程0和线程1。其中主线程的线程体是main方法里的内容。

此外,Thread-0和Thread-1两条线程输出的变量i的值是不连续的,而i并非是局部变量,而是实例成员变量,从这一点可以看出,每次创建线程都创建了一个ThreadOne对象。

2.2实现Runnable接口创建线程

实现Runnable接口创建并启动线程的步骤如下:

1、创建Runnable接口的实现类,重写run方法。run方法的内容即是线程要执行的任务。

2、创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象。该Thread对象才是真正的线程类。


线程类代码如下:

//通过实现Runnable接口创建线程类
public class ThreadTwo implements Runnable{
	private int i;
	
	//run方法同样是线程的执行体
	@Override
	public void run() {
		for (i = 0; i < 5; i++) {
			//实现Runnable接口创建线程类时,只能使用Thread.currentThread()来获取当前线程
			System.out.println(Thread.currentThread().getName()+" "+i);
		}
	}
}

测试代码如下:

public class TestThreadTwo {
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			//打印主线线程的信息
			System.out.println(Thread.currentThread().getName()+" "+i);
			if (i==3) {
				ThreadTwo threadTwo = new ThreadTwo();
				ThreadTwo threadTwo2 = new ThreadTwo();
				//创建并启动第一条线程
				new Thread(threadTwo).start();
				//创建并启动第二条线程
				new Thread(threadTwo2).start();
			}
		}
	}
}

运行结果如下:

main 0
main 1
main 2
main 3
Thread-0 0
Thread-1 0
Thread-0 1
main 4
Thread-0 3
Thread-1 2
Thread-0 4

从运行结果可以看出,Thread-0和Thread-1打印的i值是连续的,说明这两条线程是共享一个实例的。这是因为,我们所创建的两个Thread类使用同一个Runnable对象作为target。

在实际开发中,推荐使用实现Runnable接口的方式来创建线程,这样还可以实现或继承其他类,也方便线程间共享资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值