一、并发与并行

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

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

  

二、启动线程

  无论是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唤醒该线程。

多线程学习(第一天)java语言的线程的更多相关文章

  1. javaSE习题 第一章 JAVA语言概述

    转眼就开学了,正式在学校学习SE部分,由于暑假放视频过了一遍,略感觉轻松,今天开始,博客将会记录我的课本习题,主要以文字和代码的形式展现,一是把SE基础加强一下,二是课本中有很多知识是视频中没有的,做 ...

  2. JAVA语言规范-线程和锁章节之同步、等待和通知

    JAVA语言规范:线程和锁 1 同步 java编程语言提供了线程间通信的多种机制.这些方法中最基本的是同步化,此方法是使用监视器实现的.JAVA中每个对象与一个监视器相关联,一个线程可以加锁和解锁监视 ...

  3. 第一章 Java语言概述

    1.人机交互有两种方法:一种是图形化界面,一种是命令行方式 2.如何打开命令行:开始-在运行命令行中输入cmd 3.常用的DOS命令: dir(directory):列出当前目录下文件及文件夹 md( ...

  4. Java基础知识二次学习-- 第一章 java基础

    基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...

  5. java 学习笔记1 java语言概述及开发环境

    高级语言运行机制 高级语言按程序的执行方式分为编译型和解释型两种. java语言比较特殊,Java程序的执行必须经过先编译后解释的步骤. 1 编译生成字节码,只面向JVM(.class) 2Jvm执行 ...

  6. 第一天 Java语言概述

    一.什么是软件 软件就是按照特定的顺序把数据和指令组合在一起,能够完成相应功能的程序. 软件分为两种: 系统软件:专门用户运行其他程序的平台.比如Linux.Windows.MAC等 应用软件:完成相 ...

  7. 第一章 Java语言概述1

    1.人机交互有两种方法:一种是图形化界面,一种是命令行方式 2.如何打开命令行:开始-在运行命令行中输入cmd 3.常用的DOS命令: dir(directory):列出当前目录下文件及文件夹 md( ...

  8. 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制

    内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...

  9. java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)

    最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早 ...

  10. 第一章 Java语言概述2

    一.编写第一个Java应用程序 1.下载.安装JDK 官方网址:www.oracle.com java.sun.com 安装JDK 傻瓜式安装,下一步即可. 建议:安装路径不要有中文或者特殊符号,如空 ...

随机推荐

  1. 数据库原理-SQL查询语句

    参考书籍<Oracle 数据库开发与应用> SQL查询语句,针对数据库中的表提供了各种查询功能.这里分为五个部分,说明在SQL中如何对数据进行查询. 简单查询 SELCET语句是最简单的S ...

  2. leetcode刷题(二)

    1.栈 逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分.给定逆波兰表 ...

  3. e-flow归档流程如何修改附件

    OQ有时候要把CRB流程中已结束的单子替换一个附件,来应付客户的Audit.到后台CRB库中的admin for change,找到那张单子替换其中的值,变成在流转中的状态,就可以替换附件了. 其他流 ...

  4. jinkens设置工作主目录

    linux下,默认jenkins的主目录,位于当前用户下的.jenkins目录,需要自定义该目录位置的时候,可以通过设定环境变量 JENKINS_HOME 然后重启jenkins nohup java ...

  5. Windows11使用WSL Ubuntu搭建paddle的GPU环境

    Windows11使用WSL Ubuntu搭建paddle的GPU环境 最近升级到了Windows11,突然有个大胆的想法:在Windows11上安装WSL,将所有开发环境安装到WSL中.这样就能在w ...

  6. Pytest初识

    一.单元测试框架简介 1. 什么是单元测试 单元测试是指在软件开发过程中,针对软件的最小单位(函数,方法)进行正确性的检查测试. 2. 常用单元测试框架 2.1 Java 类别 junit testn ...

  7. RabbitMQ异常注意 reply-code=404, reply-text=NOT_FOUND - no exchange 'topic' in vhost '/', class-id=50

    1.问题排查: 第一次,一定要先启动Provider再启动Consumer!!! rabbitmq为初始状态没有队列信息,然后我又没有启动consumer,所以导致provider找不到queue和e ...

  8. DEDE在文章列表文章没有缩略图的不显示图片,有的则显示缩略图

    解决在文章列表文章没有缩略图的不显示图片,有的则显示缩略图在5.3最开始的版本.好象是有这个功能的. 就是在列表里..如果改文章没有缩略图则不显示默认的 没有缩略图的土片.如果有则显示缩略图 但在后续 ...

  9. 【GENERAL FRAMEWORK】总框架——持续更新

    引: 鉴于目前挖的坑较多,未防止某些即将长期更新的博文出现烂尾,特设此框架 1.蓝桥杯(完结)         1.[蓝桥杯单片机组]LED.蜂鸣器与继电器--138-573的外设操作         ...

  10. cocos2d-lua 控制台输入Lua指令方便调试

    用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对cocos2d-x程序稍微修改下,使其可以直接从控制台读入lua指令,方便调试. 1 首先在行首加入lua的引用,如下 1 #in ...