广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java基础:彻底搞懂java多线程
  • 595
分享到

Java基础:彻底搞懂java多线程

2024-04-02 19:04:59 595人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录进程与线程使用多线程的优势线程的状态创建线程线程中断总结进程与线程 进程 进程是操作系统结构的基础,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的基本单位。进程可

进程与线程

进程

进程是操作系统结构的基础,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的基本单位。进程可以被看作程序的实体,同样,它也是程序的容器

线程

线程是操作系统调度的最小单元,也叫作轻量级进程。在一个进程中可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性。

使用多线程的优势

  • 使用多线程可以减少程序的响应时间

如果某个操作很耗时,或者陷入长时间的等待,此时程序将不会响应鼠标和键盘等的操作,使用多线程后可以把这个耗时的操作分配到一个单独的线程中执行,从而使程序具备了更好的交互性。

  • 与进程相对,线程创建和切换开销更小,同时多线程在数据共享方面效率非常高。
  • 多CPU 或者多核计算机本身就具备执行多线程的能力。

如果使用单个线程,将无法重复利用计算机资源,这会造成资源的巨大浪费。在多CPU计算机中使用多线程能提高CPU的利用率。

  • 使用多线程能简化程序的结构,使程序便于理解和维护。

线程的状态

  • New

新创建状态。线程被创建,还没有调用start方法,在线程运行之前还有一些基础工作要做。

  • Runnable

可运行状态。一旦调用start方法,线程就处于Runnable 状态。一个可运行的线程可能正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。

  • Blocked

阻塞状态。表示线程被阻塞,它暂时不活动。

等待状态。线程暂时不活动,并且不运行任何代码,这消耗最少资源,直到线程调度器重新激活它。

  • Timed waiting

超时等待状态。和等待不同的是,它是可以在指定的时间自行返回的。

  • Terminated

终止状态。表示当前线程已经执行完毕。导致线程终止有两种情况:(1)run方法执行完毕正常退出;(2)因为一个没有捕获取得异常而终止了run 方法,导致线程进入终止状态。

在这里插入图片描述

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

创建线程

  • 继承Thread类,重写run()方法
    
    public class ThreadExample2 extends Thread{
    	public static void main(String[] args) {
    		Thread mThread=new ThreadExample2();
    		mThread.start();
    	}
    	@Override
    	public void run() {
    		 System.out.print("thread excute");		
    	}
    }
    
  • 实现Runnable接口,并实现该接口的Run()方法 (推荐)
    
    public class ThreadExample {
    	public static void main(String[] args) {
          ExRunnable runnable=new ExRunnable();
          Thread mThread=new Thread(runnable);
    	  mThread.start();
    	}
    }
    public class ExRunnable implements Runnable{
    	@Override
    	public void run() {
            System.out.print("thread excute");		
    	}
    }
    
  • 实现Callable接口,重写call()方法

Callable接口是属于Executor框架中的功能类。Callable可以在任务接受后提供一个返回值,Runnable无法提供这个功能。

  • Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常。
  • 运行Callable可以拿到一个Future对象,Future对象表示异步计算的结果,它提供了检查计算是否完成的方法。
  • 由于线程属于异步计算模型,因此无法从别的线程中得到函数的返回值,在这种情况下就可以使用Future来监视目标线程调用call()方法的情况。但调用Future的get()方法以获取结果时,当前线程就会阻塞,直到call()方法返回结果。

public class ThreadExample {
	public static void main(String[] args) {
	  ExCallable mCallable=new ExCallable();
	  ExecutorService mExecutorService=Executors.newSingleThreadExecutor();
	  Future<String> mFuture=mExecutorService.submit(mCallable);
	  try {
		System.out.println(mFuture.get());
	  } catch (Exception e) {
		e.printStackTrace();
	  }
	}
}
public class ExCallable implements Callable<String> {
	@Override
	public String call() throws Exception {
		// TODO Auto-generated method stub
		return "thread excute";
	}
}

线程中断

当线程的run 方法执行完毕,或者在方法中出现没有捕获的异常时,线程将终止。interrupt方法可以用来请求中断线程。当一个线程调用interrupt方法时,线程的中断标识位为true,线程会不时地检测这个中断标识位,以判断线程是否应该被中断。

// 判断线程是否被中断
Thread.currentThread().isInterrupted();

抛出InterruptedException 异常后,两种处理方法:


void task(){
     ....
     try{
        sleep(50)
     }catch(InterruptedException e){
        Thread.currentThread().interrupted(); 
     }
 }

在catch子句中,调用Thread.currentThread().interrupted()来设置中断状态(因为抛出异常后中断标识位会复位,即重新设置为false),让外界通过Thread.currentThread().isInterrupted() 来决定是否终止还是继续下去。


void task() throw InterrupetedException{
     sleep(50); 
  }

不用try来捕获异常,让方法直接抛出,这样调用者可以捕获这个异常。

中断线程Example


public class StopExampleThread {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			InterruptedRunnable mRunnable=new InterruptedRunnable();
			Thread thread=new Thread(mRunnable,"threadDemo");
			thread.start();
			TimeUnit.MILLISECONDS.sleep(10);
			thread.interrupt();
		} catch (InterruptedException e) {
			// 抛出InterruptedException后中断标志被清除
			// 再次调用interrupt恢复中断
			Thread.currentThread().interrupt();
		}
	}
	static class InterruptedRunnable implements Runnable{
		int i=0;
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(!Thread.currentThread().isInterrupted()) {
				i++;
				System.out.println("i="+i);
			}
			System.out.println("stop");			
		}
	}

总结

  • 如果一个线程处于阻塞状态,线程在检查中断标识位时,如果发现中断标识位为true,则会在阻塞方法调用处抛出InterruptedException 异常,并且在抛出异常前将线程的中断标识位复位,即重新设置为false。
  • 被中断的线程不一定会终止,中断线程是为了引起线程的注意,被中断的线程可以决定如何去响应中断。如果是比较重要的线程则不会理会中断,而大部分情况则是线程会将中断作为一个终止的请求。

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: Java基础:彻底搞懂java多线程

本文链接: https://www.lsjlt.com/news/133636.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java基础:彻底搞懂java多线程
    目录进程与线程使用多线程的优势线程的状态创建线程线程中断总结进程与线程 进程 进程是操作系统结构的基础,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的基本单位。进程可...
    99+
    2022-11-12
  • 彻底搞懂Java多线程(一)
    目录Java多线程线程的创建线程常用方法线程的终止1.自定义实现线程的终止2.使用Thread的interrupted来中断3.Thraed.interrupted()方法和Thre...
    99+
    2022-11-12
  • 彻底搞懂Java多线程(二)
    目录Java中的锁1.synchronized锁(jvm层的解决方案,也叫监视器锁)2.手动锁Locksynchronized锁synchronized使用场景1.使用synchro...
    99+
    2022-11-12
  • 彻底搞懂Java多线程(三)
    目录Java线程池线程池的优点线程池的6种创建方式创建单个线程池的作用是什么?线程池的第七种创建方式ThreadPoolExecutor的执行方式ThreadPoolExecutor...
    99+
    2022-11-12
  • 彻底搞懂Java多线程(四)
    目录SimpleDateFormat非线程安全问题ThreadLocalThreadLocal的原理ThreadLocal常用方法ThreadLocal的初始化Inheritable...
    99+
    2022-11-12
  • 彻底搞懂Java多线程(五)
    目录单例模式与多线程立即加载/饿汉模式延时加载/懒汉模式饿汉/懒汉对比阻塞队列的实现常见的锁策略乐观锁CASCAS在java中的应用CAS 的ABA问题ABA 问题的解决悲观锁独占锁...
    99+
    2022-11-12
  • 一文彻底搞懂java多线程和线程池
    目录 什么是线程 一. Java实现线程的三种方式1.1、继承Thread类1.2、实现Runnable接口,并覆写run方法二. Callable接口...
    99+
    2022-11-12
  • Java基础之让你彻底搞懂代理模式
    目录一、代理模式二、静态代理三、动态代理四、总结一、代理模式 什么是代理模式? 先来生活常用例子:你想买票,你没必要去车站买;而是可以去一个代售点,代售点代理车站卖票,这就是一个简单...
    99+
    2022-11-12
  • 如何彻底搞懂jdk8线程池
    这篇文章将为大家详细讲解有关如何彻底搞懂jdk8线程池,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。顶层设计,定义执行接口Interface Executor(){ &n...
    99+
    2023-06-25
  • 彻底搞懂java并发ThreadPoolExecutor使用
    目录前言正文一. 线程池的简单原理二. 线程池的创建三. 线程池执行任务1. 执行无返回值任务2. 执行有返回值任务3. 执行有返回值任务时抛出错误4. ThreadPoolExec...
    99+
    2023-02-28
    java并发ThreadPoolExecutor java 并发
  • 一篇文章彻底搞懂jdk8线程池
    这可能是最简短的线程池分析文章了。 顶层设计,定义执行接口 Interface Executor(){ void execute(Runnable command); ...
    99+
    2022-11-12
  • 一篇搞懂Java多线程
    Java多线程是指在一个程序中可以同时执行多个线程,每个线程执行不同的任务。多线程可以提高程序的并发性和效率。Java多线程的实现有...
    99+
    2023-09-14
    Java
  • Java多线程基础
    目录一、线程二、创建多线程的方式1、继承Thread类实现多线程2、实现Runnable接口方式实现多线程3、Callable接口创建线程三、线程的生命周期与状态四、线程的执行顺序1...
    99+
    2022-11-12
  • java——多线程基础
    目录多线程使用场景:线程和进程区别:创建线程的方式:Thread类的有关方法:线程的同步:模拟火车站售票程序线程的同步:synchronized1. 同步代码块:2. synchro...
    99+
    2022-11-12
  • 【Java】Java多线程编程基础
    文章目录 1. 进程与线程1.1 进程与线程的基本认识1.1.1 进程(Process)1.1.2 线程(Thread) 1.2 为什么会有线程1.2.1 以看视频为例 2. ...
    99+
    2023-10-03
    java python 开发语言
  • 一文彻底搞懂Java和JDK的版本命名问题
    Java是面向对象的编程语言,在我们开发Java应用的程序员的专业术语里,Java这个单词其实指的是Java开发工具,也就是JDK(Java Development Kit)。所以我...
    99+
    2022-11-12
  • Java多线程——基础概念
    目录java多线程并发与并行:多线程使用场景:创建线程的方式:Thread类的有关方法:线程的同步:       ...
    99+
    2022-11-12
  • java多线程:基础详解
    目录Java内存模型主内存和工作内存的交互命令内存模型的原子性内存模型的可见性内存模型的有序性指令重排优化的底层原理valatile原理volatile与加锁的区别先行发生原则线程的...
    99+
    2022-11-12
  • JAVA多线程线程安全性基础
    目录线程安全性什么是线程安全的代码什么是线程安全性 总结线程安全性 一个对象是否需要是线程安全的,取决于它是否被多个线程访问,而不取决于对象要实现的功能 什么是线程安全的代码 核心:...
    99+
    2022-11-12
  • 彻底明白Java的多线程-线程间的通信(1)(转)
    彻底明白Java的多线程-线程间的通信(1)(转)[@more@]三. 线程间的通信1. 线程的几种状态线程有四种状态,任何一个线程肯定处于这四种状态中的一种:1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作