一、并发与并行

  并发:处理器不停的切换有操作的线程。

  并行:多个处理器同时执行有操作线程。

  

二、启动线程

  无论是A,B哪种方式实现多线程,都需要通过Thread.start方法启动线程。

  A、Thread

    自定义类继承Thread

public class MyThread extends Thread {

    private String name;

    public MyThread(String name) {
this.name = name;
} public void run(){
for (int i = 0; i < 1000; i++) {
System.out.print("我是Thread子线程"+this.name+" ");
}
}
}
public static void main(String[] args) {
Thread t = new MyThread("A");
t.start(); Thread t1 = new MyThread("B");
t1.start();
}

  B、Runnable

    自定义类实现Runnable接口

public class MyThread implements Runnable{

    private String name;

    public MyThread(String name) {
this.name = name;
} @Override
public void run(){
for (int i = 0; i < 1000; i++) {
System.out.print("我是Thread子线程"+this.name+" ");
}
}
}
    public static void main(String[] args) {
Thread t1 = new Thread(new MyThread("A"));
t1.start(); Thread t2 = new Thread(new MyThread("B"));
t2.start();
}

 三、多线程取钱问题

  存在多次取钱,账号余额不减的情况

/**
* ATM对象
*/
public class AtmThread extends Thread { Account account; long amount; public AtmThread(Account account, long amount) {
this.account = account;
this.amount = amount;
} public void run() {
System.out.println();
System.out.println(this.getName()+"开始取钱("+this.amount+")->");
System.out.println(this.getName()+"查询余额("+this.account.balance+")->");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (this.account.balance < this.amount) {
System.out.println("余额不足");
return;
}
this.account.setBalance(this.account.balance-this.amount);
System.out.println(this.getName()+"结束取钱,余额:"+this.account.balance);
}
}
/**
* 账户
*/
public class Account {
/**
* 余额
*/
long balance; public Account(long balance) {
this.balance = balance;
} public long getBalance() {
return balance;
} public void setBalance(long balance) {
this.balance = balance;
}
}
public static void main(String[] args) {
Account account = new Account(1000);
/**
* 取5次钱
*/
for (int i = 0; i < 5; i++) {
new AtmThread(account, 600).start();
}
}
Thread-0开始取钱(600)->
Thread-3开始取钱(600)->
Thread-3查询余额(1000)->
Thread-0查询余额(1000)->
Thread-4开始取钱(600)->
Thread-4查询余额(1000)->
Thread-1开始取钱(600)->
Thread-1查询余额(1000)->
Thread-2开始取钱(600)->
Thread-2查询余额(1000)->
Thread-3结束取钱,余额:400
余额不足
Thread-0结束取钱,余额:400
Thread-1结束取钱,余额:400
余额不足

解决上面问题,使用synchronized关键字。代码修改如下:将账号对象加锁处理。

运行结果:

Thread-0开始取钱(600)->
Thread-0查询余额(1000)->
Thread-0等待中。。。。。。
Thread-0结束取钱,余额:400 Thread-4开始取钱(600)->
Thread-4查询余额(400)->
Thread-4等待中。。。。。。
Thread-4余额不足 Thread-3开始取钱(600)->
Thread-3查询余额(400)->
Thread-3等待中。。。。。。
Thread-3余额不足 Thread-2开始取钱(600)->
Thread-2查询余额(400)->
Thread-2等待中。。。。。。
Thread-2余额不足 Thread-1开始取钱(600)->
Thread-1查询余额(400)->
Thread-1等待中。。。。。。
Thread-1余额不足

 四、wait set线程休息室

  线程执行wait方法后,都会进入到wait set中,直到有notify,notifyAll,interrupt唤醒该线程。

最新文章

  1. jquery的.html(),.text()和.val()方法
  2. Grpc微服务从零入门
  3. Code笔记 之:防盗链(图片)
  4. Leetcode 202 Happy Number 弗洛伊德判环解循环
  5. Java synchronized关键字用法(清晰易懂)
  6. struts2.3.16所需的基本的jar包
  7. SQL PROMPT 取消dbo前缀
  8. Linux chmod命令修改文件与文件夹权限的命令附实例
  9. JMeterPluginCMD命令行工具使用详解
  10. HDU5781--ATM Mechine(概率dp)
  11. Etcd学习(一)安装和.NETclient測试
  12. SQL中将某个表中的多行数据在一个字段显示
  13. “出错了”和报告Bug的艺术
  14. php高精度计算问题
  15. TCP/IP协议示意图
  16. Abp + gRpc 如何实现用户会话状态传递
  17. js模板引擎-art-template常用总结(转)
  18. BZOJ 2173 luoguo P4451 [国家集训队]整数的lqp拆分
  19. 微网站|h5弹窗|手机网站 html5 弹窗、弹层、提示框、加载条
  20. React Native移动开发实战-3-实现页面间的数据传递

热门文章

  1. 跨平台C++ DLL导出宏
  2. vue3 使用watch 监听多个数据
  3. 42.Linux查看日志的几种方式
  4. 计算机存储内部数据的原理,编程语言的发展史和分类,python解释器的下载和安装,计算机cmd窗口的使用,环境变量和解释器多版本共存方法
  5. mysql 根据父id查询下级所有数据
  6. VMware-安装rpm包出现警告:tigervnc-1.1.0-24.el6.x86_64.
  7. shell实现接口初次失败告警,恢复也发送一次通知
  8. C语言中关于宏定义的学习
  9. Server2008通过bat命令自动定时备份MySQL数据库
  10. CS客户端 App.Config更新问题