Java多线程-简介

一)多线程简介

进程:进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。

文本区域存储处理器执行的代码;

数据区域存储变量和进程执行期间使用的动态分配的内存;

堆栈区域存储着活动过程调用的指令和本地变量。

每一个进程可以包含多个线程。

 

线程:线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程

优点

、可以把占据时间长的程序中的任务放到后台去处理。

、适用于一些需要等待的任务场景,如用户输入、文件读写和网络收发数据。

、可使程序运行速度加快,提供访问速度。

 

缺点

、如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。

、线程需要消耗更多的内存空间。

、线程运行中,通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。

、线程终止时,需考虑对程序运行的影响。

 

线程和进程的五个阶段:新就绪运行阻塞死亡

新建状态:使用new关键字或Thread及其子类创建一个线程对象后,线程为新增状态。

就绪状态:当线程调用start()方法时,该线程进入就绪状态。线程处于就绪的队列中,等待JVM线程调度器调度。

运行状态:当JVM调度器调度线程时,会执行run()方法,线程处于运行状态中。运行状态的线程可以变为阻塞状态、就绪状态和死亡状态。

阻塞状态:当线程调用一些特殊方法时,如sleep(睡眠)、wait(等待)。线程失去了占用资源之后,该线程变为阻塞状态。

1)等待阻塞:运行中的线程调用wait()方法,使线程进入到等待阻塞状态。

2)同步阻塞:当线程获取synchronized同步锁失败(同步锁被其它线程占用)。

3)其他阻塞:线程调用 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

 

多线程Thread类中常用方法:

一)static void start(),导致此线程开始执行,使线程进入就绪状态; Java虚拟机调用此线程的run方法。

二)void run(),使线程进入运行状态,此方法不执行任何操作和返回。

三)void setName(String name),指定设置当前线程的名称,如不设置,则随机生成。

四)void setPriority(int newPriority),设置线程的优先级别,默认为5,最小为1,最大为10。

五)void setDaemon(boolean on),将此线程标记为 daemon线程或用户线程。

六)boolean isAlive(),测试这个线程是否活着。

七)void interrupt(),中断这个线程。

八)boolean isInterrupted(),测试这个线程是否中断。

九)static void yield(),暂停当前正在执行的线程对象,并执行其他线程。

十)static void sleep(long millis),使线程睡眠指定的毫秒数。

十一)void join(),等待线程死亡。

十二)static Thread currentThread(),返回对当前正在执行的线程对象的引用。

十三)void dumpStack(),将当前线程的堆栈跟踪打印到标准错误流。

 

Object类中常用方法:

一)void wait():使该线程处于等待状态。

二)void wait(long timeout):指定该线程等待的时间,已毫秒为单位。

三)void wait(long timeout, int nanos):指定该线程等待的时间,已毫秒+纳秒为单位。

四)void notify():唤醒正在等待对象监视器的单个线程。如果有多个线程,随机唤醒其中一个就绪状态的线程。

五)void notifyAll():唤醒正在等待对象监视器的所有线程。

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是关于Java多线程的存钱取钱问题。这是一个经典的多线程同步问题,可以通过使用synchronized关键字来实现线程安全。下面是一个简单的示例代码: ```java public class BankAccount { private int balance; public BankAccount(int balance) { this.balance = balance; } public synchronized void deposit(int amount) { balance += amount; System.out.println("Deposit successful. Balance: " + balance); } public synchronized void withdraw(int amount) { if (balance < amount) { System.out.println("Withdraw failed. Insufficient balance."); return; } balance -= amount; System.out.println("Withdraw successful. Balance: " + balance); } } public class Main { public static void main(String[] args) { BankAccount account = new BankAccount(1000); // Create two threads to simulate deposit and withdraw Thread depositThread = new Thread(() -> { for (int i = 0; i < 5; i++) { account.deposit(100); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread withdrawThread = new Thread(() -> { for (int i = 0; i < 5; i++) { account.withdraw(200); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }); depositThread.start(); withdrawThread.start(); } } ``` 在这个示例代码中,我们创建了一个银行账户类BankAccount,并在其中实现了deposit和withdraw方法,并使用synchronized关键字来保证线程安全。 在main方法中,我们创建了两个线程来模拟存款和取款操作,每个线程执行5次操作。我们使用Thread.sleep方法来模拟每个操作之间的间隔,以便更好地观察多线程操作的结果。 当多个线程同时访问BankAccount对象的deposit和withdraw方法时,synchronized关键字可以确保每个方法只能被一个线程访问,从而避免了竞争条件和数据不一致的问题。 希望这个示例代码能够回答您的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值