关于多线程的,相关的资料网上多的是,下面是我在实际工作中有人问到的最多的问题,现在就写写,和大家一起交流交流哦
要谈线程首先要知道什么是进程,什么线程?关于书面的解释很多,大家可以网上一搜大把的是在此我就不提了。举个例子吧:
应用程序是进程,那么这个程序在运行过程中做的事情就是线程。
工作: 听写单词 //相当于一个程序
事件1: 老师念 //相当于这个程序中要完成的一项工作
事件2: 学生写 //相当于这个程序中要完成的一项工作
实现多线程有两种方法:一是继承Thread类 ,一是实现Runnable接口
继承Thread 类实例:
import java.util.*;
public class TimePrinter extends Thread {
int pauseTime;
String name;
public TimePrinter(int x, String n) {
pauseTime = x;
name = n;
}
public void run() { //重写了run()方法
while(true) {
try {
System.out.println(name + ":" + new
Date(System.currentTimeMillis()));
Thread.sleep(pauseTime);
} catch(Exception e) {
System.out.println(e);
}
}
}
static public void main(String args[]) {
TimePrinter tp1 = new TimePrinter(1000, "间隔1秒");
tp1.start(); //进程由start()函数调用
TimePrinter tp2 = new TimePrinter(3000, "间隔3秒");
tp2.start();
}
}
实现runnable 接口实例:
import java.util.*;
public class TimePrinter2
implements Runnable {
int pauseTime;
String name;
public TimePrinter2(int x, String n) {
pauseTime = x;
name = n;
}
public void run() {
while(true) {
try {
System.out.println(name + ":" + new
Date(System.currentTimeMillis()));
Thread.sleep(pauseTime);
} catch(Exception e) {
System.out.println(e);
}
}
}
static public void main(String args[]) {
Thread t1 = new Thread (new TimePrinter(1000, "间隔1秒"));
t1.start(); //进程由start()函数调用
Thread t2 = new Thread (new TimePrinter(3000, "间隔3秒"));
t2.start();
}
}
此接口只有一个函数,run(),此函数必须由实现了此接口的类实现。
注意,当使用 runnable 接口时,您不能直接创建所需类的对象并运行它;必须从 Thread 类的一个实例内部运行它。许多程序员更喜欢 runnable 接口,因为从 Thread 类继承会强加类层次。
synchronized 同步
出现多个线程访问同一个对象时就会用到synchronized
大多数有用的程序中,线程之间通常有信息流。试考虑一个金融应用程序,它有一个 Account 对象,如下例中所示:
public class Account {
String holderName;
float amount;
public Account(String name, float amt) {
holderName = name;
amount = amt;
}
public void deposit(float amt) {
amount += amt;
}
public void withdraw(float amt) {
amount -= amt;
}
public float checkBalance() {
return amount;
}
}
在此代码样例中潜伏着一个错误。如果此类用于单线程应用程序,不会有任何问题。但是,在多线程应用程序的情况中,不同的线程就有可能同时访问同一个 Account 对象,比如说一个联合帐户的所有者在不同的 ATM 上同时进行访问。在这种情况下,存入和支出就可能以这样的方式发生:一个事务被另一个事务覆盖。这种情况将是灾难性的。但是,Java 编程语言提供了一种简单的机制来防止发生这种覆盖。每个对象在运行时都有一个关联的锁。这个锁可通过为方法添加关键字 synchronized 来获得。这样,修订过的 Account 对象(如下所示)将不会遭受像数据损坏这样的错误:
public class Account {
String holderName;
float amount;
public Account(String name, float amt) {
holderName = name;
amount = amt;
}
public
synchronized void deposit(float amt) {
amount += amt;
}
public
synchronized void withdraw(float amt) {
amount -= amt;
}
public float checkBalance() {
return amount;
}
}
deposit() 和 withdraw() 函数都需要这个锁来进行操作,所以当一个函数运行时,另一个函数就被阻塞。请注意, checkBalance() 未作更改,它严格是一个读函数。因为 checkBalance() 未作同步处理,所以任何其他方法都不会阻塞它,它也不会阻塞任何其他方法,不管那些方法是否进行了同步处理。
待续,有时间再来补充哦
分享到:
相关推荐
下面,我们将深入探讨"用Delphi编写的多线程应用实例"中涉及的核心知识点。 1. **线程的结构**:线程是操作系统分配CPU时间的基本单元,每个进程至少包含一个线程。在Delphi中,我们可以使用TThread类来创建和管理...
本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...
本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多线程允许一个应用程序同时执行多个任务,每个任务都在一个独立的线程上运行。C#中,我们可以通过System....
Linux 下 C 语言多线程编程实例 Linux 下的多线程编程是一种非常重要的技术,在...本实例提供了一个非常实用的多线程编程示例,帮助我们更好地理解多线程编程的基本概念和技术,并且可以作为实际应用的参考和借鉴。
本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆...
这些实例不仅覆盖了多线程的基础应用,还涉及到高级的并发控制和同步技术,对于理解和掌握C#.NET中的多线程编程有极大的帮助。通过分析和运行这些实例,开发者可以深入理解多线程在实际项目中的运用,提升解决问题的...
这是一个Delphi使用API来创建多线程应用程序的示例。IsDone变量的引入,是为了避免控制台应用的主线程执行结束时,进程中止导致新创建线程中止。——这甚至可能发生在新线程执行writeln()之前。 在线程函数中,...
"单选按钮"的多线程应用可能与事件处理有关。在多线程环境中,事件处理通常在引发事件的线程上运行,因此,如果一个线程修改了UI控件的状态,而另一个线程尝试处理相关事件,可能会导致线程不安全。使用适当的同步...
在这个实例中,“C#多线程进度条”是针对多线程环境下如何实现一个可视化进度条进行展示的一个经典案例。这个实例不仅涉及到多线程的创建和管理,还涵盖了用户界面的同步更新,确保在执行长时间任务时能够给用户提供...
在VC++编程环境中,多线程技术是一种强大的工具,它允许程序同时执行多个任务,从而提高应用程序的...通过学习和实践这些实例,开发者可以提升其在并发编程领域的技能,更好地设计和实现高效、稳定的多线程应用程序。
在VB6(Visual Basic 6)中实现多线程是一项技术挑战,但通过VBMThread10Demo这个示例,我们可以深入理解如何有效地利用...同时,这也提醒我们在设计多线程应用时,要充分考虑线程安全、资源管理和错误处理等关键因素。
C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多线程互斥实例 多线程获取同一变量"的示例中,我们将探讨如何在多个线程中安全地访问共享资源,避免数据不一致性和竞态条件。 首先...
标签中的"朱建强"可能是一位分享这些多线程应用实例的开发者,他的其他作品可能涵盖了更广泛的Delphi编程主题。如果想获取更多关于他的资源,可以通过标签搜索。 总之,掌握Delphi中的多线程技术对于提升软件性能至...
C# 多线程编程实例实战 本文探索了 C# 多线程编程实例实战,特别是单个写入程序/多个阅读程序的线程同步问题。在这种情况下,写入程序需要修改共享资源,而阅读程序需要读取数据。为了解决这个问题,需要满足两个...
10. **RTOS应用案例**:可能包含了实际的硬件接口操作,如LED闪烁、串口通信、液晶显示等,通过这些实例来演示多线程在实际项目中的应用。 通过学习这个示例项目,开发者不仅可以掌握STM32单片机的RT-Thread多线程...
本资源包聚焦于C#语言中的多线程应用,提供了实例程序和相关说明,帮助开发者深入理解和掌握这一技术。 标题中的"C# 多线程 应用程序 实例 程序 说明文件"表明了这个压缩包包含的内容是关于C#编程语言如何实现多...
压缩包内的“多线程实例”很可能是实际代码示例,包括上述概念的实际应用,如创建和管理线程、线程同步和通信的实例代码,以及可能的性能测试和调试工具的使用。 通过学习这些实例,开发者可以更深入地理解vc中的多...
### 用PB编写多线程应用程序 #### 一、引言 在计算机编程领域,多线程编程是一种提高程序效率的重要技术。通过让程序能够同时处理多个任务,从而充分利用计算机资源,尤其是处理器(CPU)的能力。本文将详细介绍...
在C#.NET编程环境中,多线程是一种强大的技术,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。以下将详细讲解C#.NET中的多线程及其相关实例,包括基本使用、线程互斥等核心概念。 1. **多线程...