Java/Android——多线程详解

0. 简介

进程: 是操作系统结构的基础,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的基本单位。进程可以被看作程序的实体同样,它也是线程的容器
线程: 在一个进程中可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。例如:QQ浏览器的进程,它里面运行了很多子任务,这些子任务有的加载网页,有的处理缓存,有的进行下载,这些子任务就是线程,是操作系统调度的最小单元,也叫作轻量级进程

为何使用多线程?

  • 使用多线程可以减少程序的响应时间。如果某个操作很耗时,或者陷入长时间的等待,可以放入一个单独线程中去,不影响原本线程任务执行
  • 与进程相比,线程创建和切换开销更小,同时多线程在数据共享方面效率非常高。
  • 多CPU或者多核计算机本身就具备执行多线程的能力,提高了CPU的利用率
  • 使用多线程能简化程序的结构,使程序便于理解和维护

线程的几个状态:
在这里插入图片描述

  • 调用 Thread 的 start 方法,开始进入运行状态
  • 当线程执行wait 方法后,线程进入等待状态,进入等待状态的线程需要其他线程通知才能返回运行状态。
  • 超时等待相当于在等待状态加上了时间限制,如果超过时间限制,则线程返回运行状态。
  • 当线程调用到同步方法时,如果线程没有获得锁则进入阻塞状态,当阻塞状态的线程获取到锁时则重新回到运行状态。
  • 当线程执行完毕或者遇到意外异常终止时,都会进入终止状态。

1. 创建多线程的几种方式

1.1 继承Thread类创建线程类

Thread本质上也是实现了Runnable接口的一个实例。需要注意的是调用start()方法后并不是立即地执
行多线程的代码,而是使该线程变为可运行态,什么时候运行多线程代码是由操作系统决定的。以下是其主要步骤:
(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
(2)创建Thread子类的实例,即创建了线程对象。
(3)调用线程对象的start()方法来启动该线程。
在这里插入图片描述

	package com.thread;  
	
	public class FirstThreadTest extends Thread{
     
	    int i = 0;  
	    //重写run方法,run方法的方法体就是现场执行体  
	    public void run()  
	    {
     
	        for(;i<100;i++){
     
	        System.out.println(getName()+"  "+i);  
	          
	        }  
	    }  
	    public static void main(String[] args)  
	    {
     
	        for(int i = 0;i< 100;i++)  
	        {
     
	            System.out.println(Thread.currentThread().getName()+"  : "+i);  
	            if(i==20)  
	            {
     
	                new FirstThreadTest().start();  
	                new FirstThreadTest().start();  
	            }  
	        }  
	    }  	  
	}  

1.2 通过Runnable接口创建线程类

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
(3)调用线程对象的start()方法来启动该线程。
示例代码为:

	package com.thread;  
	  
	public class RunnableThreadTest implements Runnable  
	{
     
	  
	    private int i;  
	    public void run()  
	    {
     
	        for(i = 0;i <100;i++)  
	        {
     
	            System.out.println(Thread.currentThread().getName()+" "+i);  
	        }  
	    }  
	    public static void main(String[] args)  
	    {
     
	        for(int i = 0;i < 100;i++)  
	        {
     
	            System.out.println(Thread.currentThread().getName()+" "+i);  
	            if(i==20)  
	            {
     
	                RunnableThreadTest rtt = new RunnableThreadTest();  
	                new Thread(rtt,"新线程1").start();  
	                new Thread(rtt,"新线程2").start();  
	            }  
	        }  
	  
	    }  
	  
	}  

在这里插入图片描述
在这里插入图片描述

1.3 通过Callable和Future创建线程

Callable接口一般和线程池一起使用

(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。
(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

	package com.thread;  
	  
	import java.util.concurrent.Callable;  
	import java.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yawn__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值