`

Java多线程简单概念

阅读更多
1.基础概念

1.1线程:共存于同一个进程直接的工具,独立并发执行,有自己的堆栈,程序计数器和局部变量。但是共享内存,文件句柄和进程的状态。


1.2为何使用线程:更快的响应,充分利用多处理系统,异步处理用于分解大型任务。


1.3使用线程注意:不要过分使用,特别是在轮询等待的情况下,机器资源消耗比较严重;在多个线程方位共享变量时主要保持同步;


1.4如何实现简单的Java多线程程序:extends Thread或者implements Runnable,但本质上都是需要实例化Thread,才能使用多线程。


1.5synchronized和volatile的作用:

(1)synchronized:确保每次只有一个线程可以执行受(synchronized)保护的代码;确保一个线程更改的数据对于其他线程可见

(2)volatile:比同步更简单,只适合于控制对基本变量(整数、布尔变量等)的单个实例的访问。当一个变量被声明成 volatile,任何对该变量的写操作都会绕过高速缓存,直接写入主内存,而任何对该变量的读取也都绕过高速缓存,直接取自主内存。这表示所有线程在任何时候看到的 volatile 变量值都相同。


1.6理解同步锁synchronized:不是代码块本身被锁住,而是同一个对象在不同的线程里面,谁持有锁,才能执行被锁保护的代码块。如果是两个不同的对象,那么有synchronized标志的代码块,对他们而言,没有意义。


1.7哪些地方不需要同步:

· 由静态初始化器(在静态字段上或 static{} 块中的初始化器)初始化数据时
· 访问 final 字段时
· 在创建线程之前创建对象时
· 线程可以看见它将要处理的对象时


1.8守护线程和非守护线程:每一个Java程序都由 主线程+自己创建的线程+守护线程构成,所谓守护线程就是隐藏的系统线程,如垃圾收集线程、JVM创建的其它线程等,Java程序退出之后,守护线程还在运行。可以调用Thread.setDaemon(boolean flag)方法将自己创建的线程声明为守护线程。


2.创建简单的多线程程序实例:银行ATM存取款


2.1银行账号类
package com.sun.yli.thread;

/**
 * 账户UserAccount
 * @author yli
 */
public class UserAccount {

	private String user;

	private int balance;

	public UserAccount(String user, int balance) {
		this.user = user;
		this.balance = balance;
	}

	public void drawMoney(int money) {
		if (money > this.balance) {
			System.out.println("invalid number of drawMoney");
			return;
		}
		this.balance -= money;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		this.balance = balance;
	}

	public void dispaly() {
		System.out.println(this.user + " has balance:" + this.balance);
	}

}



2.2存款实例类
package com.sun.yli.thread;

/**
 * 存款实例
 * @author yli
 */
public class UserDeposit extends Thread {

	private UserAccount user;
	private int money;

	public UserDeposit(UserAccount user, int money) {
		this.user = user;
		this.money = money;
	}

	@Override
	public void run() {
		// 账号使用同步锁
		synchronized (user) {
			int balance = user.getBalance();
			user.setBalance(balance + this.money);
			try {
				// 假设存款花费0.1秒
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("当前余额" + balance + "元;存入" + money + "元,最终余额"
					+ user.getBalance() + "元");
		}
	}
}



2.3取款实例类
package com.sun.yli.thread;

/**
 * 取款实例
 * @author yli
 */
public class UserDrawMoney extends Thread {

	private UserAccount user;
	private int money;

	public UserDrawMoney(UserAccount user, int money) {
		this.user = user;
		this.money = money;
	}

	@Override
	public void run() {
		// 账号使用同步锁
		synchronized (user) {
			int balance = user.getBalance();
			if (money > balance) {
				return;
			}
			user.setBalance(balance - money);
			try {
				// 假设取款花费0.1秒
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("当前余额" + balance + "元;取款" + money + "元,最终余额"
					+ user.getBalance() + "元");
		}
	}
}



2.4测试
package com.sun.yli.thread;

/**
 * 测试
 * @author yli
 */
public class UserBankTest {

	public static void main(String[] args) {

		UserAccount user = new UserAccount("suning", 1000);
		
		// 取款 150
		new UserDrawMoney(user, 100).start();

		// 存入 100
		new UserDeposit(user, 100).start();
		
		// 取款 50
		new UserDrawMoney(user, 100).start();

		// 存入 200
		new UserDeposit(user, 100).start();
	}

}


分享到:
评论

相关推荐

    java多线程进度条

    首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,或者实现Runnable接口并提供run()方法。在run()方法中编写...

    java 多线程简易聊天 精简版

    Java多线程技术是编程领域中的重要概念,尤其在开发高效、并发的网络应用程序时,如简易聊天程序,它的应用尤为关键。在这个“java 多线程简易聊天 精简版”项目中,我们将深入探讨Java如何实现多线程环境下的客户端...

    汪文君JAVA多线程编程实战(完整不加密)

    书中详细介绍了Java多线程的核心概念,如线程的创建、启动、同步、协作以及生命周期管理。读者将学习如何通过实现Runnable接口或继承Thread类来创建线程,以及如何使用Executor框架来管理线程池。 此外,书中还深入...

    JAVA单线程多线程

    ### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    Java多线程的简单应用

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承Thread类或者实现Runnable接口。本示例可能是一个Applet,Applet是Java小...

    Java多线程实现异步调用实例

    总之,Java多线程和异步调用是构建高效、响应迅速的应用程序的关键技术。通过合理利用这些工具和机制,开发者可以编写出能够充分利用多核处理器优势的代码,从而提高软件性能。在实际应用中,理解并熟练掌握这些概念...

    java多线程.pdf

    本文将根据提供的文件信息,深入探讨Java多线程的相关概念和技术细节。 #### 二、Java线程基础 ##### 1. 什么是线程? 线程是进程中的最小执行单元,是进程内部的一次独立的控制流程。在Java中,每个进程至少有一...

    java 多线程交互简单范例

    这个压缩包中的文件提供了几个关于Java多线程交互的实例,可以帮助我们深入理解如何在并发环境中控制线程的同步,确保数据的一致性和安全性。 首先,让我们讨论一下标题和描述中提到的关键概念——“多线程交互”和...

    java多线程学习

    在学习Java多线程的过程中,理解线程与进程的概念是非常基础且重要的一步。首先,进程是一个程序的执行实例,是操作系统资源分配的基本单位,具有独立的地址空间和运行状态。每个进程至少包含一个线程,我们称之为...

    JAVA 多线程的PPT和示例

    Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。这份"JAVA多线程的PPT和示例...

    java多线程源码,仅供参考

    Java多线程是Java编程中的核心概念,尤其在并发编程领域,它的重要性不言而喻。这个名为"java多线程源码,仅供参考"的压缩包文件,显然是为了帮助学习者深入理解Java多线程的运行机制。其中的示例程序"BounceThread...

    Java多线程编程经验

    ### Java多线程编程经验 #### 一、Java线程:概念与原理 现代操作系统都是多任务操作系统,其中多线程是一种重要的实现多任务的方式。线程是进程内的一个执行单位,一个进程可以包含多个线程。例如,在Java应用...

    java多线程学习资料

    本文将深入探讨Java多线程的基础概念、基本原理及其在实践中的应用。 #### 二、核心概念 - **进程**: 是操作系统中的一个独立执行单元,拥有自己的内存空间。在多任务操作系统中,可以同时运行多个进程。 - **线程*...

    JAVA多线程聊天工具

    "JAVA多线程聊天工具"是一个基于Java实现的简单应用,它利用了多线程的概念来创建一个实时、互动的聊天环境。在这个聊天工具中,每个用户都可以在不同的线程中运行,允许他们同时进行交谈,从而提供了一个并行的交流...

    Java多线程编辑核心技术

    在理解Java多线程技术之前,需要了解一些基础概念。首先,Java中的线程是由java.lang.Thread类或实现java.lang.Runnable接口来创建的。一个线程对象可以调用start()方法来启动线程,而run()方法则是线程执行的代码。...

    基于Java多线程同步技术的简易模拟售票系统实现.pdf

    根据给定文件的信息,本篇文档是关于Java多线程同步技术在简易模拟售票系统中的应用研究。文档详细介绍了多线程的概念、如何在Java中创建线程、线程同步技术以及如何利用这些技术来解决共享资源访问时的数据一致性...

    Java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种...这些特性和概念对于理解Java多线程编程至关重要。

    java多线程聊天室

    Java多线程聊天室是一个基于Java编程语言实现的实时通讯应用,它利用多线程技术来处理并发用户连接和通信。在这个项目中,有至少两个关键的类:Server和Control,它们分别扮演着服务器端和客户端控制台的角色。在...

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

Global site tag (gtag.js) - Google Analytics