多线程概述

1、什么是多线程?

  首先来明白一个进程概念,一个进程是指一个正在运行的应用程序,而线程就是进程的执行单元,是进程的一条执行路径。进程与线程的关系是:一个进程可以包括多条线程。所以多线程就是指一个应用程序有多条执行路径。

  我们经常用的下载器,能够同时执行多个下载任务,这就是多线程,值得注意的是,经常使用的DOS窗口是单线程的,一条指令执行结束后才能执行下一条指令。

  值得注意的是:CPU每次只能执行一条线程,而且线程的执行具有随机性,不能知道某一时刻哪条线程得到CPU的执行权。

2、为什么要使用多线程?

  如果程序是单线程的话,运行到某一步,假如说需要请求系统资源的时候,那么就会导致程序的阻塞(暂停),CPU就会空闲出来,就会造成资源浪费。如果我们在资源空闲的时候再创建出一条或多条线程,就能够充分的利用这些资源,使得CPU每时每刻都在工作,这样就最大效率的利用了CPU。单个进程可以有多个并发执行的线程,这样比只有一条线程执行效率要大多了。打个比方,以前这些活儿一个人干,现在有好多个人干,当然比一个人做效率高。

  所以说:多线程,为效率而生。

3、实现多线程的方法?

有两种。

(1)继承 Thread 线程类

  步骤:

    A:定义一个类继承Thread类。

    B:子类要重写Thread类的run()方法(Thread类是抽象类,继承它必须重写run方法,在方法中定义本线程执行内容)。

    C:启动线程。

 实例:

  线程类:

<span style="font-size:14px;"> //创建一个类继承Thread抽象类
public class MyThread extends Thread {

	//重写run方法
	@Override
	public void run() {
		for (int x = 0; x < 100; x++) {
			System.out.println(getName()+ x); //getName 在底层实际是this.getName,默认加上this
		}
	}
}
</span>
  测试类:

<span style="font-size:14px;">public class ThreadDemo {
	public static void main(String[] args) {

		//实例化线程对象
		MyThread my1 = new MyThread();
		MyThread my2 = new MyThread();

		//为线程对象设置名字
		my1.setName("岳飞");
		my2.setName("金兀术");

		//启动线程,注意start方法内会自动调用run方法
		my1.start();
		my2.start();
	}
}
</span>
  运行效果:当运行后,两个线程对象会争抢CPU资源,所以会争着打印自己的名字,又因为线程的随机性,所以打印出的名字没有规律性。

(2)实现 Runnable 接口

  步骤:

    A:创建一个类实现 Runnable 接口

    B:重写run()方法

    C:创建类的实例

    D:把类的实现作为Thread的构造参数传递,创建Thread对象

 实例:

  线程类:

<span style="font-size:14px;"> //定义类实现Runnable接口
public class MyRunnable implements Runnable {
	
	//重写run方法
	@Override
	public void run() {
		for (int x = 0; x < 100; x++) {
			// Thread.currentThread()方法用于返回当前线程对象的引用
			System.out.println(Thread.currentThread().getName() + x);
		}
	}
}</span>
  测试类:

<span style="font-size:14px;">public class MyRunnableDemo {
	public static void main(String[] args) {

		//实例化线程对象,只需创建一个即可
		MyRunnable my = new MyRunnable();

		Thread t1 = new Thread(my); //这个构造方法用于将实现Runnable接口的类转化为Thread类
		Thread t2 = new Thread(my);

		t1.setName("岳飞");
		t2.setName("金兀术");

		t1.start();//启动线程
		t2.start();
	}
}</span>
  和上边的执行效果是一样的。

  比较:建议使用第二种,实现Runnable接口,因为这种方法避免了单继承的局限性(如果一个类已经有了父类,那么,它就不能再去继承Thread类)。而且,实现Runnable接口的方式只创建了一个线程类对象。

4、线程的生命周期?

  线程的生命周期共分成五个阶段:

  小结:多线程,为效率而生。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值