学习线程之前首先要理解什么是进程?什么是线程?
进程: 每个正在系统上运行的程序都是一个进程。
线程:每个进程包括多个线程。线程是一组指令的几何,或者是程序的特殊段,它可以在程序里独立执行。
多线程:在单个程序中同时运行多个线程完成工作,为多线程。
线程 Thread 程序继承Thread之后必须要重写run方法。
每一个进程都至少有一个主执行线程(main)。
在多线程中为保证安全,要考虑线程同步和防止死锁。当两个或多个线程同时等待对方释放资源的时候就会形成线程之间的死锁。为防止死锁的发生,需要通过同步来实现线程安全。
何为同步?通俗的讲就是让多个线程在不同的时间执行相同的任务。即同步不同时。
有同步,也有异步。异步的概念与同步相反,即在同一时间执行同一任务。即异步同时。
实现线程同步的方法:
1.使用同步块
synchronized(Object){
}
2.synchronized方法 只能用于实例化方法
3.同步锁Lock 用来锁代码的
Lock lc = new ReentrantLock();
lc.lock();
lc.unlock();
下面的例子说明了Lock 的用法
public class Main { public static void main(String args[]) { User user = new User(); Card c = new Card(user, 800); Card c2 = new Card(user, 500); c.start(); c2.start(); } }
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 银行账户 * * @author Dream * */ public class User { int money; Lock lc = new ReentrantLock(); public User() { money = 1000; } /** * 取钱的方法 */ public void getMoney(int n) { lc.lock();// 上锁 // 模拟机器的计算时间 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } money -= n; System.out.println("取钱完成,剩余金额:" + money); lc.unlock();// 解锁 } }
/** * 取钱的线程 * * @author Dream * */ public class Card extends Thread { User user;// 账户 int n; public Card(User user, int n) { this.user = user; this.n = n; } public void run() { user.getMoney(n); } }
这是两张卡同时用一个账户取钱的例子。当两张卡同时取钱时,如果不加锁,两次取钱后剩余金额会出现200,500,-300,三种情况。加锁之后两次取钱之后剩余金额为-300。此例也可用synchronized同步。
线程中还有生产/消费者模式:
主要用到wait/notify方法 wait等待,notify结束等待。
还可用LinkedBlockingQueue,阻塞队列(同步队列) 其中take(),put(),方法内部已实现等待,接触等待的功能,可以直接调用,而不用考虑资源是否足够。
相关推荐
以下是对VC下创建子线程例子的深入解析,旨在帮助初学者克服对线程理解的难点。 ### 线程基本概念 在计算机科学中,线程是程序执行流的最小单元,一个标准的程序由多个线程组成。线程允许程序在同一时间处理多个...
NSOperation是对操作的封装,它可以代表任何需要执行的任务。通过将NSOperation对象添加到NSOperationQueue中,系统会自动处理线程管理和并发控制。NSOperationQueue还支持设置最大并发量和操作间的依赖关系,使得...
通过对进程与线程生动形象的理解,我们可以更直观地把握这两个概念的本质及其在实际应用中的作用。从类比的角度出发,我们不仅能够理解进程与线程的基本特性,还能够深入探索它们在操作系统层面的设计思路及其实现...
### 线程的理解,看完就明白了 在计算机科学领域,**线程**是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程(Process)至少有一个线程,如果一个进程中只有一个线程...
本教程将帮助初学者理解C#中的多线程概念,并通过一个Windows Forms应用程序实例,演示如何在WinForm控件中启动、暂停、继续子线程以及输出数据。 首先,我们来看多线程的基本概念。在单线程程序中,所有的任务按...
这就是"java线程理解小程序"的初衷,帮助开发者学习如何在Android环境中正确地管理和使用线程。 首先,我们需要理解Java中的线程创建方式。最基础的是通过实现`Runnable`接口或继承`Thread`类来创建线程。实现`...
了解线程安全的编程技巧,如使用线程安全的数据结构和避免全局变量,对编写健壮的多线程程序至关重要。 9. **中断和异常**:线程可以通过`interrupt()`方法中断,其他线程可以检查`isInterrupted()`或`...
然而,理解和正确使用线程并非易事,尤其是对于初学者。 在Java中,`main`函数后面的`String[] args`参数是一个可选的命令行参数列表。当用户通过命令行运行Java程序时,可以传递额外的参数,这些参数以空格分隔,...
总结起来,无论是C语言还是Java,实现多线程都需要理解线程的创建、调度、同步和通信。通过合理利用线程,开发者可以编写出更高效、响应更快的应用程序,充分利用现代计算机的多核优势。在实际开发中,应根据需求...
在Windows编程领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于简化Windows应用程序的...开发者需要理解线程间通信、线程安全和调试技巧,才能充分发挥多线程的优势,创建出健壮的MFC应用程序。
1. **信号量(Semaphore)**:用于控制对共享资源的访问,当资源可用时,信号量值会减一,当资源不足时,线程会被阻塞,直到信号量值增加到允许访问为止。 2. **锁(Lock)**:包括互斥锁(Mutex)和读写锁(RW-Lock)。...
理解这两种模型是编程尤其是服务器端开发的基础,尤其是在Java、C#等支持多线程的编程语言中。 首先,让我们来详细探讨一下**单线程**的概念。在单线程环境中,程序的执行是由一个单一的执行线程控制的,这意味着...
Swing线程的深入理解和SwingWorker基础知识介绍 Swing线程是Java程序设计中的一种重要概念,用于处理图形用户界面(GUI)中的线程问题。在本文中,我们将深入探讨Swing线程的理解和SwingWorker基础知识,并通过实例...
在IT领域,多线程是程序设计中的一个重要概念,尤其在现代计算机系统中,它能够充分利用多核处理器的计算能力,提高程序的执行效率。...理解并掌握多线程编程,能帮助开发者编写出更高效、稳定的软件系统。
在易语言中,理解和使用多线程许可证可以帮助开发者更好地管理这些线程,防止因资源竞争导致的问题,如数据不一致性和死锁。 许可证系统是多线程编程中的一个工具,用于限制同时访问特定资源的线程数量。在易语言中...
- **信号量(Semaphores)**:限制对资源的并发访问数量,超过限制的线程会被阻塞,直到资源可用。 - **事件(Events)**:通过WaitHandle类的子类(如ManualResetEvent或AutoResetEvent)来同步线程,一个线程等待...
首先,理解线程的基本概念是至关重要的。线程是程序中的执行路径,一个进程可以包含多个线程,它们共享同一内存空间,各自执行不同的任务。多线程可以提高程序的并发性,使得程序能够同时处理多个任务,从而提升效率...
4. **线程局部存储**:线程局部变量只对创建它的线程可见,这样可以在多线程环境中避免数据冲突。 5. **线程状态**:线程通常有新建(New)、可运行(Runnable)、阻塞(Blocked)、等待(Waiting)、终止...
Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是个单线程,所以说他是假的单线程。 那么什么时候用多...